BeautifulSoup.select方法

时间:2016-12-24 01:04:18

标签: python beautifulsoup

此脚本假设采用命令行字符串并通过谷歌搜索引擎运行,然后如果找到结果,它将打开不同选项卡中的前5个。我有一些问题试图让它发挥作用。我认为问题发生在它所说link = soup.select(".r a")的底部,我一直在改变这里的值,然后它将显示具有实际长度的下一行。但是像这样运行它显示长度仍为0.我试图刮掉.r类和标记,因为这似乎是搜索结果从谷歌结果源代码开始的地方。

import requests
import bs4
import sys
import webbrowser

print("Googling...")
response = requests.get("https://www.google.com/#q=" + " ".join(sys.argv[1:]))
response.raise_for_status()

'''Function to return the top search result links'''
soup = bs4.BeautifulSoup(response.text, "html.parser")

'''Open a browser tab for each result'''
links = soup.select(".r a")
print(len(links))
numOpen = min(5, len(links))

for i in range(numOpen):
    webbrowser.open("https://google.com/#q=" + links[i].get("href"))

2 个答案:

答案 0 :(得分:1)

您的逻辑是正确的,但谷歌搜索的网址不对。

一定是

response = requests.get("https://www.google.com/search?q=" + " ".join(sys.argv[1:]))
...
for i in range(numOpen):
    webbrowser.open("https://www.google.com" + links[i].get("href"))

以下是完整代码:

import requests
import bs4
import sys
import webbrowser

print("Googling...")
response = requests.get("https://www.google.com/search?q=" + " ".join(sys.argv[1:]))
response.raise_for_status()

'''Function to return the top search result links'''
soup = bs4.BeautifulSoup(response.text, "html.parser")

'''Open a browser tab for each result'''
links = soup.select(".r a")
print(len(links))
numOpen = min(5, len(links))

for i in range(numOpen):
    webbrowser.open("https://www.google.com" + links[i].get("href"))

答案 1 :(得分:0)

您是对的!该问题应由select(".r a")引起 我建议您尝试find_all('a',{"data-uch":1}),它将找到所有具有data-uch = 1

属性的标签

说明:

”不过,如果您稍微看一下元素,就会有一个类似这样的元素:。在HTML源代码的其余部分中, 看起来r类仅用于搜索结果链接。”

上面的句子来自本书。但是,实际上,如果您打印此汤变量soup = bs4.BeautifulSoup(response.text, "html.parser"),则不会发现任何<h3 class="r">`` in the HTML source code. That is why print(len(links))```始终显示0。