嘿,我正在尝试抓取网站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)
答案 0 :(得分: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 '})
看看是否有帮助
答案 1 :(得分:0)
我认为您不能传递这样的复合类名称。我使用这些是复合类名。我已经使用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')]