首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >纸幅刮板工艺

纸幅刮板工艺
EN

Stack Overflow用户
提问于 2021-07-23 16:14:12
回答 2查看 24关注 0票数 1

我一直在尝试替换输出中的一些文本,但一直没有成功。

我希望输出结果如下所示

代码语言:javascript
复制
su-n-s-e-t
 https://64.media.tumblr.com/35fb46ace19cf31bf16c3655eff26fa6/bc3cfd4a41299b1e-9a/s500x750/98bbd40e71066761a4bd5983896932dd56c94427.jpg
houndsofvalinor-art
 https://64.media.tumblr.com/e89e2a223d965a0351e310c829389583/ce52b6a3e76c58be-6e/s500x750/43548527d68eac8def536a88901a2ff78355ef51.jpg 
amazinglybeautifulphotography
 https://64.media.tumblr.com/a7d31eb63666d39d10868debbab9e27c/5be73c7f5dadb3dd-aa/s500x750/5b10d9cc0400e7b0dbabb9ea14c37e6b91e85e91.jpg 
kylebonallo
 https://64.media.tumblr.com/b406c3ceb50e4e09e550710b35de1310/dddef868163205f7-71/s500x750/9fec23368ed8ca5d6effae89fbdcda54554d0a68.jpg 
expressions-of-nature
 https://64.media.tumblr.com/e1eb3612511e21177dfa66ac02f07b98/c5b5c1fc2cbbc58d-e1/s500x750/550dbdf7568167891c5ea1af18af9cbc91cd620f.jpg 
ex0skeletal-undead
 https://64.media.tumblr.com/14d837eb6159b8376443393d8b1ef551/fb5d595667e75d0f-79/s500x750/cee48e58e0b1191376e20fd11904c09adbea50b3.jpg 
geopsych
 https://64.media.tumblr.com/a596b92db62c8ae4f68b490d172f8227/c856f013961ced0e-10/s500x750/73fb838c8065174e5ede5d93698ea386e6df1efe.jpg 
jacobvanloon
 https://64.media.tumblr.com/ca5f1e13bb4642de55422e74611f1df6/6f85f80cb48e73f7-e4/s500x750/12b59223056baf7733d99f210f1cd8bc397d52cd.png 
amazinglybeautifulphotography
 https://64.media.tumblr.com/06a1ff4abc50e80df59ddbd6e9c8c42c/3fd49bbbfb9dffd8-df/s500x750/43d3adf64f6fec58ebd37633be4988f36746e819.jpg 

url_list变量返回:

代码语言:javascript
复制
geopsych
[' https://64.media.tumblr.com/a596b92db62c8ae4f68b490d172f8227/c856f013961ced0e-10/s500x750/73fb838c8065174e5ede5d93698ea386e6df1efe.jpg 500w']
burningmine
[' https://64.media.tumblr.com/e32b99ad1de8f8cd494205982c0137a1/54985812c55123d3-99/s500x750/cbe83b505eb14ff36e2be05e171a30bfd073a41b.jpg 500w']
amazinglybeautifulphotography
[' https://64.media.tumblr.com/06a1ff4abc50e80df59ddbd6e9c8c42c/3fd49bbbfb9dffd8-df/s500x750/43d3adf64f6fec58ebd37633be4988f36746e819.jpg 500w']

这是我尝试过的:

代码语言:javascript
复制
for results in urls:
                results.replace('500w','')

但我还是在500w的结尾得到了它。

由于我想在没有['']的情况下在一行中获得每个链接,所以我尝试用.split('\n')而不是.split(',')来拆分它,但似乎我在使用它时也遇到了错误。

下面是代码的其余部分:

代码语言:javascript
复制
import requests
from bs4 import BeautifulSoup

search_term = 'landscape'
posts_scrape = requests.get(f'https://www.tumblr.com/search/{search_term}')
soup = BeautifulSoup(posts_scrape.text, 'html.parser')

articles = soup.find_all('article', class_='_2DpMA')

for article in articles:
    try:
        source = article.find('div', class_='_3QBiZ').text
        urls = []
        for imgvar in article.find_all('img', alt='Image'):
            url_list = [i for i in imgvar['srcset'].split(',') if (i.find('500w') != -1)]
            urls.append(url_list)
        for results in urls:
            results.replace('500w','')
        print (source)
        print (results)
    except AttributeError:
        continue
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-23 16:27:48

我建议使用字典来存储图像URLS。键是图像的源,值是图像URL的列表。例如:

代码语言:javascript
复制
import requests
from bs4 import BeautifulSoup

search_term = "landscape"
posts_scrape = requests.get(f"https://www.tumblr.com/search/{search_term}")
soup = BeautifulSoup(posts_scrape.text, "html.parser")

articles = soup.find_all("article", class_="_2DpMA")

data = {}
for article in articles:
    try:
        source = article.find("div", class_="_3QBiZ").text
        for imgvar in article.find_all("img", alt="Image"):
            data.setdefault(source, []).extend(
                [
                    i.replace("500w", "").strip()
                    for i in imgvar["srcset"].split(",")
                    if "500w" in i
                ]
            )
    except AttributeError:
        continue

for source, image_urls in data.items():
    for url in image_urls:
        print(source)
        print(url)

打印:

代码语言:javascript
复制
leahberman
https://64.media.tumblr.com/e29c3dd39ab0e413ff6eefa0cfc973de/d6817667d3007f74-09/s500x750/2971fc9af6619f1f783bb169b104dea023f339de.gifv
leahberman
https://64.media.tumblr.com/8c61e084290ccea6fef3eab1d96204fd/d6817667d3007f74-b8/s500x750/45873681924618d179bfc97e04a02d3d6ebaac39.gifv
leahberman
https://64.media.tumblr.com/c4db8bc21289aec008219f5a4b307714/d6817667d3007f74-85/s500x750/c49d38c369ccb507d950b116e637886ac4467685.gifv
poetry-siir
https://64.media.tumblr.com/5495c24e4608688a6a0052d81da01882/d97a76eeb3edd5e9-d7/s500x750/9862a63fe430e83850ceb73f384bf2af6322db5e.jpg
poetry-siir
https://64.media.tumblr.com/9944d7a5d2d26a57118c8b391b699efb/d97a76eeb3edd5e9-ad/s500x750/7cfc69a18143d5b2a678fe0c85c431e5387a2107.jpg

...and so on.
票数 1
EN

Stack Overflow用户

发布于 2021-07-23 16:35:33

我认为问题主要存在于下面这行代码中:

代码语言:javascript
复制
results.replace('500w','')

首先:results是一个list,所以它没有.replace()方法。如果您不让AttributeError静音,您就会看到这一点。您至少应该这样打印一个错误:

代码语言:javascript
复制
except AttributeError as exc:
    print(exc)

您将看到它输出了一个非常描述性的错误:'list' object has no attribute 'replace'

第二:我猜你想要替换results中的实际urls,去掉末尾的“500w”。Python中的字符串是不可变的,这意味着对str的任何转换都会创建一个新的str,而不是修改第一个字符串。因此,您在这里修改了一个str,创建了一个新的,但没有将其存储在任何地方。

第三:您的urls列表在for循环的每次迭代中都会被擦除。您可能希望在循环外声明它,并使其包含所有匹配的urls。

这是一段代码,我理解你想要做的事情:

代码语言:javascript
复制
import requests
from bs4 import BeautifulSoup

search_term = 'landscape'
posts_scrape = requests.get(f'https://www.tumblr.com/search/{search_term}')
soup = BeautifulSoup(posts_scrape.text, 'html.parser')

articles = soup.find_all('article', class_='_2DpMA')

urls = []

for article in articles:
    try:
        source = article.find('div', class_='_3QBiZ').text
        for imgvar in article.find_all('img', alt='Image'):
            url = next((i for i in imgvar['srcset'].split(',') if i.endswith('500w')), None)
            if url:
                urls.append(url.strip().replace(' 500w', ''))
    except AttributeError as exc:
        print(exc)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68496091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档