我正在尝试从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
,但得到一个空列表
答案 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="]')