汤类选择器返回一个空列表

时间:2019-07-20 08:46:22

标签: python beautifulsoup

我正在尝试从Google搜索页面中检索链接列表,但漂亮的汤选择器返回一个空列表。

我使用requests获取了页面代码,并使用bs4 BeautifulSoup解析了检索到的响应,然后使用了soup.select方法来获取某个类。我最终得到一个空列表

import webbrowser as wbb
import requests
from bs4 import BeautifulSoup as BS

term = "minmax"
res = requests.get('https://www.google.com/search?q={}'.format(term))
soup = BS(res.text)
links= soup.select(".rc")

我希望包含links类的列表rc,但得到一个空列表

2 个答案:

答案 0 :(得分:3)

您需要使用user-agent标头。 Google似乎拒绝了没有请求的请求。

这有效:

import requests
from bs4 import BeautifulSoup

term = "minmax"
res = requests.get('https://www.google.com/search?q={}'.format(term), 
                   headers={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0'})
res.raise_for_status()
soup = BeautifulSoup(res.text, 'html.parser')
links = soup.select(".rc")
print(links)

答案 1 :(得分:0)

那是因为在请求中获得的HTML中没有带有class =“ rc”的标记。您可以添加以下代码段以确认HTML源代码。

with open("google.html", "w") as fout:
    fout.write(soup.prettify())

这将创建google.html。只需通过任何文本编辑器将其打开,就不会找到带有class =“ rc”的标签。您可能会在Google Chrome浏览器的DevTools或其他浏览器中找到带有class =“ rc”的标签。

为什么在DevTools中查看HTML时为什么会有class =“ rc”的标签,而在HTML请求中却没有标签?这是因为请求获得的HTML是Google Http服务器响应的原始 HTML,在DevTools中查看的HTML在JavaScript DOM修改HTML后显示 >

由于通过请求获取HTML时不会自动执行JavaScript,因此必须根据原始HTML(JavaScript DOM修改HTML之前的HTML)构建CSS选择器。如果您不想每次都编写python代码来获取原始HTML,则还可以在Google Chrome浏览器中查看原始HTML。只需查看所需的网页,然后右键单击并选择“查看页面源”。它将显示原始HTML,该原始HTML在 JavaScript DOM更改HTML内容之前。

似乎链接以以下代码开头。

<a href="/url?q=

因此您可以像这样更改CSS选择器。

links= soup.select('a[href^="/url?q="]')