首页 > 解决方案 > Beautifulsoup 选择方法未按预期选择结果

问题描述

遵循第 11 章中的自动化无聊的东西教程,我感觉很幸运Google 搜索项目。它看似正确地下载了 HTML 数据,但是当我使用 beautifulsoup 选择结果链接时,我什么也没得到。根据它说使用的书soup.select('.r a'),它没有选择任何东西。

阅读我尝试使用不同语法的文档soup.select('[class~=r]'),希望让 beautifulsoup 选择一些东西,但它没有。我也尝试过选择不同的课程,但它也没有这样做,所以我认为我做的事情根本上是错误的。

SEARCHVAR = sys.argv[1:]

res = requests.get('http://google.com/search?q=' + ' '.join(SEARCHVAR))
res.raise_for_status()
print('Searching ' + ' '.join(SEARCHVAR[:]) + ' on Google')
soup = bs4.BeautifulSoup(res.text, 'html.parser')
print('Parsing')
linkElems = soup.select('.r a') 
print(str(linkElems))

我用print(str(linkElems))来检查 beautifulsoup 选择了什么,但我什么也没得到,只是[]

标签: python

解决方案


由于您对 Google 的 get 请求,这不起作用。如果我在 Google 上的 chrome 中使用开发人员工具,则 div 类 r 确实存在。但是,当我使用 request.get 下载查询时,它不再存在。但是,现在有一个名为“jfp3ef”的 div 类。我能够通过以下方式获得与搜索结果相关联的标签

soup = soup.find_all("div", {"class": "jfp3ef"})
for div in soup:
    print(div.select("a"))

如果您愿意,您可以使用 urllib.request 下载带有 r 类中的 div 的整个页面,但 Google 会阻止此行为,因此您必须更改标头信息。

SEARCHVAR = sys.argv[1:]
query = 'http://google.com/search?q=' + ' '.join(SEARCHVAR)
headers = {}
headers['User-Agent'] = "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 
(KHTML, like Gecko) Chrome/24.0.1312.27 Safari/537.17"
req = urllib.request.Request(query, headers= headers)
html = urllib.request.urlopen(req).read()
print('Searching ' + ' '.join(SEARCHVAR[:]) + ' on Google')
soup = bs4.BeautifulSoup(html, 'html.parser')
print('Parsing')
linkElems = soup.select('.r a') 
print(str(linkElems)

书中的例子已经过时了。我假设我的“jfp3ef”类的顶级示例是从谷歌随机抽取的,很快就会中断,或者可能根本不适合你。底部的例子运行良好。


推荐阅读