如何优化和限制BeautifulSoup结果

2024-06-01 10:14:51 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我被困在这里了。我是一名医生,所以我的编程背景和技能几乎没有,很可能这就是问题所在。我正在努力学习Python的一些基础知识,对我来说,最好的方法就是做一些事情

该项目:

  • 从几本书上刮下封面图像

使用的一些链接:

http://coleccaoargonauta.blogspot.com/2011/09/1-perdidos-na-estratosfera.html
http://coleccaoargonauta.blogspot.com/2011/09/n-2-o-estranho-mundo-de-kilsona.html
http://coleccaoargonauta.blogspot.com/2011/09/n-3-ultima-cidade-da-terra.html
http://coleccaoargonauta.blogspot.com/2011/09/n-4-nave-sideral.html
http://coleccaoargonauta.blogspot.com/2011/09/n-5-o-universo-vivo.html

那个网站结构搞砸了。 链接位于类为“post title entry title”的div内,该类又有两个或多个“分隔符”类div,这些类div可以有内容,也可以为空。 到目前为止,我能说的是95%的时间我想要的是前两个“separator”类DIV中的最后两个链接。对于这个阶段来说,这已经足够好了

我的代码如下:

#intro
r=requests.get(url)
soup = BeautifulSoup(r.content, 'lxml')

#select the first teo 'separator' divs
separador = soup.select("div.separator")[:2]

#we need a title for each page - for debugging and later used to rename images      
titulo = soup.find_all("h3", {"class": "post-title entry-title"})[0]
m = titulo.string
print (m)

#the find all links loop
for div in separador:
  imagens = div.find_all('a')
  for link in imagens:
    print (link['href'], '\n')

我现在能做的是:

  • 我可以打印正确的URL,然后使用wget下载和重命名文件。然而,我只想要搜索结果中的最后两个链接,这是我的google fu中唯一缺少的东西。我认为问题在于BeautifulSoup导出结果的方式(ResultSet)以及我在列表等方面缺乏ok知识。如果第一个“分隔符”有一个链接,第二个有两个链接,我会得到一个包含两个项目的列表(第二个项目是两个链接),因此不可滑动

示例输出

2-O Estranho Mundo de Kilsona.jpg
http://3.bp.blogspot.com/-tAyl2wdRT1g/UPfbGczmv2I/AAAAAAAAB0M/mP71TRQIg3c/s1600/2+-+O+Estranho+Mundo+de+Kilsona.jpg 

http://4.bp.blogspot.com/-D0cUIP8PkEU/UPfbByjSuII/AAAAAAAAB0E/LP6kbIEJ_eI/s1600/Argonauta002.jpg 

http://3.bp.blogspot.com/-tAyl2wdRT1g/UPfbGczmv2I/AAAAAAAAB0M/mP71TRQIg3c/s1600/2+-+O+Estranho+Mundo+de+Kilsona.jpg 

但我希望是这样

2-O Estranho Mundo de Kilsona.jpg

http://4.bp.blogspot.com/-D0cUIP8PkEU/UPfbByjSuII/AAAAAAAAB0E/LP6kbIEJ_eI/s1600/Argonauta002.jpg 

http://3.bp.blogspot.com/-tAyl2wdRT1g/UPfbGczmv2I/AAAAAAAAB0M/mP71TRQIg3c/s1600/2+-+O+Estranho+Mundo+de+Kilsona.jpg 

有人能解释一下吗


Tags: divcomhttptitle链接htmldejpg
2条回答

您可以使用CSS选择器使用类分隔符(link to docs)直接从div提取图像

我还使用list comprehension代替for循环

下面是列表中url的工作示例


import requests
from bs4 import BeautifulSoup

#intro
url = "http://coleccaoargonauta.blogspot.com/2011/09/1-perdidos-na-estratosfera.html"
r=requests.get(url)
soup = BeautifulSoup(r.content, 'lxml')


#we need a title for each page - for debugging and later used to rename images      
titulo = soup.find_all("h3", {"class": "post-title entry-title"})[0]
m = titulo.string
print (m)

#find all links
links = [link['href'] for link in soup.select('.separator a')]
print(links)

问题是由于在循环中调用了行imagens = div.find_all('a')。这将创建一个listlists。因此,我们需要找到一种方法,将它们扁平化为一个列表。我在下面用merged_list = [] [merged_list.extend(list) for list in imagens]行来做这件事

然后,我从这里创建一个只包含链接的新列表,然后通过使用set调用来删除该列表的重复数据(当您不需要重复数据时,set是一种有用的数据结构)。然后,我将其转换回list,然后返回到您的代码

import requests
from bs4 import BeautifulSoup

link1 = "http://coleccaoargonauta.blogspot.com/2011/09/1-perdidos-na-estratosfera.html"
link2 = "http://coleccaoargonauta.blogspot.com/2011/09/n-2-o-estranho-mundo-de-kilsona.html"
link3 = "http://coleccaoargonauta.blogspot.com/2011/09/n-3-ultima-cidade-da-terra.html"
link4 = "http://coleccaoargonauta.blogspot.com/2011/09/n-4-nave-sideral.html"
link5 = "http://coleccaoargonauta.blogspot.com/2011/09/n-5-o-universo-vivo.html"


#intro
r=requests.get(link2)
soup = BeautifulSoup(r.content, 'lxml')

#select the first teo 'separator' divs
separador = soup.select("div.separator")[:2]

#we need a title for each page - for debugging and later used to rename images      
titulo = soup.find_all("h3", {"class": "post-title entry-title"})[0]
m = titulo.string
print (m)

imagens = [div.find_all('a') for div in separador]
merged_list = []
[merged_list.extend(list) for list in imagens]
link_list = [link['href'] for link in merged_list]
deduped_list = list(set(link_list))
for link in deduped_list:
    print(link, '\n')

相关问题 更多 >