如何使用 bs4 打印第一个 google 搜索结果链接?

Posted

技术标签:

【中文标题】如何使用 bs4 打印第一个 google 搜索结果链接?【英文标题】:How to print the first google search result link using bs4? 【发布时间】:2021-10-28 09:22:48 【问题描述】:

我是 python 的初学者,我正在尝试从 google 获取第一个搜索结果链接,该链接使用 beautifulsoup 存储在 class='yuRUbf' 的 div 中。当我运行脚本输出为“无”时,这里的错误是什么。

import requests
import bs4

url = 'https://www.google.com/search?q=site%3A***.com+how+to+use+bs4+in+python&sxsrf=AOaemvKrCLt-Ji_EiPLjcEso3DVfBUmRbg%3A1630215433722&ei=CR0rYby7K7ue4-EP7pqIkAw&oq=site%3A***.com+how+to+use+bs4+in+python&gs_lcp=Cgdnd3Mtd2l6EAM6BwgAEEcQsAM6BwgjELACECc6BQgAEM0CSgQIQRgAUMw2WPh_YLiFAWgBcAJ4AIABkAKIAd8lkgEHMC4xMC4xM5gBAKABAcgBCMABAQ&sclient=gws-wiz&ved=0ahUKEwj849XewdXyAhU7zzgGHW4NAsIQ4dUDCA8&uact=5'

request_result=requests.get( url )
soup = bs4.BeautifulSoup(request_result.text,"html.parser")
productDivs = soup.find("div", "class": "yuRUbf")
print(productDivs)

【问题讨论】:

【参考方案1】:

让我们看看:

    from bs4 import BeautifulSoup
import requests, json

headers = 
    'User-agent':
    "useragent"



html = requests.get('https://www.google.com/search?q=hello', headers=headers).text
soup = BeautifulSoup(html, 'lxml')
# locating div element with a tF2Cxc class
# calling for <a> tag and then calling for 'href' attribute
link = soup.find('div', class_='tF2Cxc').a['href']
print(link)

输出:

''' https://www.youtube.com/watch?v=YQHsXMglC9A

【讨论】:

【参考方案2】:

因为你想首先谷歌搜索你正在寻找的类名可能与名称不同,所以首先你可以先手动找到该链接,这样很容易识别

import requests
import bs4

url = 'https://www.google.com/search?q=site%3A***.com+how+to+use+bs4+in+python&sxsrf=AOaemvKrCLt-Ji_EiPLjcEso3DVfBUmRbg%3A1630215433722&ei=CR0rYby7K7ue4-EP7pqIkAw&oq=site%3A***.com+how+to+use+bs4+in+python&gs_lcp=Cgdnd3Mtd2l6EAM6BwgAEEcQsAM6BwgjELACECc6BQgAEM0CSgQIQRgAUMw2WPh_YLiFAWgBcAJ4AIABkAKIAd8lkgEHMC4xMC4xM5gBAKABAcgBCMABAQ&sclient=gws-wiz&ved=0ahUKEwj849XewdXyAhU7zzgGHW4NAsIQ4dUDCA8&uact=5'

request_result=requests.get( url )

soup = bs4.BeautifulSoup(request_result.text,"html.parser")

使用select方法:

    我使用了 css 选择器方法,它可以识别所有匹配的 divs 和我从索引位置 1 获取的列表

    我使用select_one 获取a 标签并找到href 根据它!

main_data=soup.select("div.ZINbbc.xpd.O9g5cc.uUPGi")[1:]
main_data[0].select_one("a")['href'].replace("/url?q=","")

使用find方法:

main_data=soup.find_all("div",class_="ZINbbc xpd O9g5cc uUPGi")[1:]
main_data[0].find("a")['href'].replace("/url?q=","")

输出[两种情况相同]:

'https://***.com/questions/23102833/how-to-scrape-a-website-which-requires-login-using-python-and-beautifulsoup&sa=U&ved=2ahUKEwjGxv2wytXyAhUprZUCHR8mBNsQFnoECAkQAQ&usg=AOvVaw280R9Wlz2mUKHFYQUOFVv8'

【讨论】:

查找方法效果很好,但是当我再次更改“url”时,输出无效 因为类名可能不同,所以它不会总是相同的类名 那么适用于所有 url 的解决方案是什么?当我检查时,我在所有页面上都得到了相同的类 'class="yuRUbf" 能否再分享一下网址供参考 是的,对于上面的汽车 URL 是正确的,它可以识别 div,但问题是包含在第一个索引中的 URL 与网页中的不同,在这种情况下,您可以使用 try 和 except 阻止从和如果 status_code 不是 200 那么你可以去下一个索引

以上是关于如何使用 bs4 打印第一个 google 搜索结果链接?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 bs4 正确解析谷歌搜索结果?

如何使用 python(最好是 BS4)从 Google 图片(或 bing)中找到图片的 url?

将链接从 selenium 迭代到 bs4 并打印剥离的字符串

使用PHP输出Google搜索结果?

从 javascript 调用 Google 云打印/搜索 API

如何在文本文件中将输出复制到 bs4 中的终端