【问题标题】:Python BS4 find() find_all() returns empty listsPython BS4 find() find_all() 返回空列表
【发布时间】:2018-12-12 13:45:12
【问题描述】:

嘿,我正在尝试抓取一个网站https://www.dawn.com/pakistan,但 python find() find_all() 方法返回空列表,我尝试了 html5.parser、html5lib 和 lxml 仍然没有运气。 我试图抓取的类存在于源代码和汤对象中,但似乎没有工作,任何帮助将不胜感激,谢谢!

代码:

from bs4 import BeautifulSoup 

import lxml

import html5lib

import urllib.request

url1 = 'https://www.dawn.com/pakistan'


req = urllib.request.Request(
    url1, 
    data=None, 
    headers=
{
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'
}
                        )
url1UrlContent=urllib.request.urlopen(req).read()
soup1=BeautifulSoup(url1UrlContent,'lxml')

url1Section1=soup1.find_all('h2', class_='story__title-size-five-text-black- 
font--playfair-display')
print(url1Section1)

【问题讨论】:

  • 我正在尝试获取特定的类,然后通过进一步抓取从它们中提取数据,当我在“div”和“文章”具有特定的类名。我尝试了所有不同的解析器,但没有运气。
  • 我的问题不同,它与标记的重复答案无关,任何帮助将不胜感激!

标签: python web-scraping beautifulsoup


【解决方案1】:

你的应该也可以(我使用了不同的语法)。但这是您拥有的字符串不匹配。

你有:'story__title-size-five-text-black- font--playfair-display'

我有:'story__title size-five text-black font--playfair-display ' 差别很小

替换:

url1Section1=soup1.find_all('h2', class_='story__title-size-five-text-black- font--playfair-display')

与:

url1Section1=soup1.find_all('h2', {'class':'story__title size-five text-black font--playfair-display '})

看看有没有帮助

【讨论】:

  • 哦,非常感谢它的工作,请你能解释一下,这是如何工作的,我的没有工作,因为我一直在用它来抓取其他网站,而我的之前工作正常,但不适用于该网站。并且您使用的语法在 bs4 文档中找不到使用类名进行抓取的位置。
  • 这是我刚刚习惯使用的语法。但你的方式也可以。这是你上课的字符串。这不完全是源 html 中的内容。无论如何,如果答案有效,请接受答案。干杯!
  • 哦我错了字符串,请看一下这个类名 url1Section1=soup1.find_all('div', class_='col-sm-6 col-12') 它返回空列表无论如何。
  • 这很奇怪,我从那个确切的代码中得到了 7 个对象
  • 是的,它在检查元素 class_='col-sm-6 col-12' 中很奇怪,在 'col-sm-6' 和 'col-12' 之间存在两个空格,但在页面源中它之间存在一个空格,因此当您使用 find_all 找到带有两个空格的列表时,它会返回空列表,但是当您使用 find_all 找到带有一个空格的列表时,它会返回 8 个对象,我不知道为什么 html 表现不同,在检查元素窗口和页面源窗口。
【解决方案2】:

我认为你不能像这样传递复合类名。我使用这些是复合类名。我使用 css 选择器作为一种更快的检索方法。复合词用“.”填充。

如果您在标题之后,您可以使用稍微不同的选择器组合

import requests
from bs4 import BeautifulSoup

url= 'https://www.dawn.com/pakistan'
res = requests.get(url)
soup = BeautifulSoup(res.content, "lxml")
items = [item.text.strip() for item in soup.select('h2[data-layout=story] a')]
print(items)

要限制在左边你可以使用的那些:

items = [item.text.strip() for item in soup.select('.story__title.size-five.text-black.font--playfair-display a' )]

更广泛地说,

items = [item.text.strip() for item in soup.select('article [data-layout=story]')] 

根据您的评论:

items = [item.text.strip() for item in soup.select('.col-sm-6.col-12')] 

【讨论】:

  • 我正在尝试获取特定的类,然后通过进一步抓取从它们中提取数据,当我在“div”和“文章”具有特定的类名。我尝试了所有不同的解析器,但没有运气
  • 上面有抓取文章的例子。里面没有 div 中的内容。您能否举一个您希望看到的 div 内容的具体示例?
  • 我尝试使用 url1Section1=soup1.find_all('h2', class_='story__title-size-five-text-black-font--playfair-display') 获取的类名是什么返回空或无,我尝试了所有的解析器,但没有运气。
  • 它工作正常,但是当我尝试 url1Section1=soup1.find_all('h2', class_='story__title-size-five-text-black- font--playfair-display') 其他课程时它返回空列表或不返回,我无法理解我遇到的问题,例如我的此类代码不起作用 url1Section1=soup1.find_all('div', class_='col-sm-6 col-12' )。
  • 我认为这是由于空格。这些是复合类名。我使用 css 选择器作为一种更快的检索方法,并用“。”填充空格。在类名中。
猜你喜欢
  • 2021-04-27
  • 2019-12-12
  • 2019-03-25
  • 2017-11-28
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
相关资源
最近更新 更多