【发布时间】:2021-08-23 23:10:30
【问题描述】:
我的目标是用 python 编写一个网页抓取程序,它使用 beautifulsoup 解析谷歌搜索结果页面,并一次打开多个结果链接。程序如下所示:
#! python3
# searchGoogle.py - Opens several google results.
import requests, sys, webbrowser, bs4
print('Searching...') # display text while downloading the result page
res = requests.get('https://www.google.com/search?q=' + ' '.join(sys.argv[1:]))
res.raise_for_status()
# Retrieve top search result links.
soup = bs4.BeautifulSoup(res.text, 'html.parser')
# Open a browser tab for each result.
linkElems = soup.select('div.yuRUbf > a')
numOpen = min(5, len(linkElems))
for i in range(numOpen):
urlToOpen = linkElems[i].get('href')
print('Opening', urlToOpen)
webbrowser.open(urlToOpen)
由于我的 HTML 技能有限,我不太清楚如何检索包含链接的 HTML 元素。
这是我要解析的网页: https://www.google.com/search?q=boring+stuff
我的浏览器的开发者控制台显示以下 HTML 代码:
所有链接都在带有 class="yuRUbf" 的元素中(我在附图中标记了一个示例。)
我的问题: 我必须传递给 soup.select() 方法的正确论点是什么?因为所有 'a' 元素都直接在 'div' 元素中,并且这些元素具有名为 'yuRUbf' 的类属性,所以我认为 'div.yuRUbf > a' 是正确的......但程序不起作用。网页没有在浏览器中打开。
哪位经验丰富的 HTML 开发人员可以帮助我解决这个问题?我传递给soup.select() 方法的论点不正确吗?应该是什么?还是其他地方有问题?
我正在使用 MacOS Catalina 和 Python 3.8。
【问题讨论】:
-
请粘贴指向该网页的链接,或者粘贴实际代码,而不是图像。如果有人想尝试您的代码以提供帮助,我们需要实际的 html 来对其进行测试。
-
DOM ≠ 页面源。由于看起来您使用的是 chrome,因此您将使用像
requests这样的 HTTP 客户端获得的页面的更准确表示将在实际的 View Page Source 视图中(Windows:CTRL- U,macOS:Command-U)。您所定位的元素可能都不存在于实际页面源中,而是使用 JavaScript 动态生成的,requests和BeautifulSoup都无法解释/执行。 -
@William 好的,抱歉,我将链接发布到搜索结果页面。
-
@aurumpurum 你想学习 bs4 吗?还是解析谷歌?如果你想搜索谷歌,有一个很棒的包:pypi.org/project/googlesearch-python
-
@William 尝试学习 bs4 以进行网络抓取 :-) 我知道还有其他软件包,例如 selenium,但我想一步一步地进行。感谢您的 googlesearch_python 软件包!看起来很有趣,会去看看!干杯。
标签: python html parsing web-scraping