beautifulsoup选择方法未按预期选择结果

时间:2019-05-27 18:31:47

标签: python

在第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,但是我什么也没得到,只有[]

2 个答案:

答案 0 :(得分:1)

替换此:

linkElems = soup.select('div#main > div > div > div > a')

使用:

linkElems = soup.select('div#main > div > div > div > a')

答案 1 :(得分:0)

由于您向Google提出了请求,因此无法使用。如果我在Google的chrome中使用开发人员工具,则div类r确实存在。但是,当我使用request.get下载查询时,该查询不再存在。但是,现在有一个名为“ jfp3ef”的div类。我可以通过以下方法获取与搜索结果相关的a标签

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”的最佳示例是从Google随机抽取的,并且很快就会破解,或者对您完全不起作用。最下面的示例效果很好。