【问题标题】:Python. Getting ONLY href link content from Google search resultsPython。仅从 Google 搜索结果中获取 href 链接内容
【发布时间】:2016-02-13 12:16:45
【问题描述】:

如何仅将 LINKS 列表作为输出? 我已经尝试过使用 beautifulsoup 和 selennium 的其他解决方案,但它们仍然给我的结果与我目前得到的结果非常相似,即链接的 href 和锚文本。我尝试按照一些较旧的答案建议使用 urlparse,但似乎该模块不再使用,我对整个事情感到困惑。这是我的代码,目前正在输出链接和锚文本,这不是我想要的:

import requests, re
from bs4 import BeautifulSoup
headers = {'User-agent':'Mozilla/5.0'}
page = requests.get('https://www.google.com/search?q=Tesla',headers=headers)
soup = BeautifulSoup(page.content,'lxml')
global serpUrls
serpUrls = []
links = soup.findAll('a')
for link in soup.find_all("a",href=re.compile("(?<=/url\?q=)(htt.*://.*)")):
    #print(re.split(":(?=http)",link["href"].replace("/url?q=","")))
    serpUrls.append(link)

print(serpUrls[0:2])

xmasRegex = re.compile(r"""((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.‌​][a-z]{2,4}/)(?:[^\s()<>]+|(([^\s()<>]+|(([^\s()<>]+)))*))+(?:(([^\s()<>]+|(‌​([^\s()<>]+)))*)|[^\s`!()[]{};:'".,<>?«»“”‘’]))""", re.DOTALL)
mo = xmasRegex.findall('[<a href="/url?q=https://www.teslamotors.com/&amp;sa=U&amp;ved=0ahUKEwjvzrTyxvTKAhXHWRoKHUjlBxwQFggUMAA&amp;usg=AFQjCNG1nvN_Z0knKTtEah3whTIObUAhcg"><b>Tesla</b> Motors | Premium Electric Vehicles</a>, <a class="_Zkb" href="/url?q=http://webcache.googleusercontent.com/search%3Fq%3Dcache:rzPQodkDKYYJ:https://www.teslamotors.com/%252BTesla%26gws_rd%3Dcr%26hl%3Des%26%26ct%3Dclnk&amp;sa=U&amp;ved=0ahUKEwjvzrTyxvTKAhXHWRoKHUjlBxwQIAgXMAA&amp;usg=AFQjCNEZ40VWO_fFDjXH09GakUOgODNlHg">En caché</a>]')
print(mo)

我只想要“http://urloflink.com”,而不是整行代码。有什么办法可以做到这一点?谢谢!

输出如下所示:

[<a href="/url?q=https://www.teslamotors.com/&amp;sa=U&amp;ved=0ahUKEwjI39vl2_TKAhXFWxoKHRX-CFgQFggUMAA&amp;usg=AFQjCNG1nvN_Z0knKTtEah3whTIObUAhcg"><b>Tesla</b> Motors | Premium Electric Vehicles</a>, <a class="_Zkb" href="/url?q=http://webcache.googleusercontent.com/search%3Fq%3Dcache:rzPQodkDKYYJ:https://www.teslamotors.com/%252BTesla%26gws_rd%3Dcr%26hl%3Des%26%26ct%3Dclnk&amp;sa=U&amp;ved=0ahUKEwjI39vl2_TKAhXFWxoKHRX-CFgQIAgXMAA&amp;usg=AFQjCNEZ40VWO_fFDjXH09GakUOgODNlHg">En caché</a>]
[('https://www.teslamotors.com/&amp;sa=U&amp;ved=0ahUKEwjvzrTyxvTKAhXHWRoKHUjlBxwQFggUMAA&amp;usg=AFQjCNG1nvN_Z0knKTtEah3whTIObUAhcg"', '', '', '', '', '', '', '', ''), ('http://webcache.googleusercontent.com/search%3Fq%3Dcache:rzPQodkDKYYJ:https://www.teslamotors.com/%252BTesla%26gws_rd%3Dcr%26hl%3Des%26%26ct%3Dclnk&amp;sa=U&amp;ved=0ahUKEwjvzrTyxvTKAhXHWRoKHUjlBxwQIAgXMAA&amp;usg=AFQjCNEZ40VWO_fFDjXH09GakUOgODNlHg"', '', '', '', '', '', '', '', '')]

【问题讨论】:

  • 我是新手,所以我使用的是我猜到的最好的解决方案,但我怀疑它不是,这就是我问的原因。我相信有更好的方法或一些模块可以更轻松地完成它。我尝试安装 GoogleScraper 模块,但由于某种原因,pycharm 和 pip 都无法在我的计算机上安装它。
  • 我也试过这个,也没有得到我需要的东西:results = driver.find_elements_by_css_selector('div.g') link = results[0].find_element_by_tag_name("a") href = link.get_attribute("href")
  • 你看过urllib吗?
  • 我做过,但我在某处听说“以后不要使用 URLlib。它比请求更复杂、更慢,所以使用请求”。这就是为什么我首先尝试了 Selenium/Request 路线。也许我错过了什么。

标签: python selenium hyperlink beautifulsoup


【解决方案1】:

您正在寻找这个,不需要seleniumCSS 选择器reference):

# container with needed data e.g: title, link, snippet, displayed link.
for result in soup.select('.tF2Cxc'):

  # grab only link from the container
  link = result.select_one('.yuRUbf a')['href']

查看SelectorsGadget Chrome 扩展程序,通过单击浏览器中所需的元素来获取CSS 选择器。


代码和full example in the online IDE

from bs4 import BeautifulSoup
import requests, lxml

headers = {
    'User-agent':
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
}

# https://docs.python-requests.org/en/master/user/quickstart/#passing-parameters-in-urls
params = {
  "q": "tesla",   # query
  "gl": "us",     # country to search from
  "hl": "en",     # language
}

html = requests.get("https://www.google.com/search", headers=headers, params=params)
soup = BeautifulSoup(html.text, 'lxml')

for result in soup.select('.tF2Cxc'):
  link = result.select_one('.yuRUbf a')['href']
  print(link, sep='\n')

---------
'''
https://www.tesla.com/
https://en.wikipedia.org/wiki/Tesla,_Inc.
https://en.wikipedia.org/wiki/Nikola_Tesla
'''

或者,您可以使用来自 SerpApi 的 Google Organic Results API 来实现相同的目的。这是一个带有免费计划的付费 API。

您的情况的不同之处在于,您不必处理此类事情,因为它已经为最终用户完成,相反,您只需要遍历结构化 JSON 并获取您想要的数据。

要集成的代码:

import os
from serpapi import GoogleSearch

params = {
  "engine": "google",
  "q": "tesla",
  "hl": "en",
  "gl": "us",
  "api_key": os.getenv("API_KEY"),
}

search = GoogleSearch(params)
results = search.get_dict()

for result in results["organic_results"]:
  print(result['link'])

---------
'''
https://www.tesla.com/
https://en.wikipedia.org/wiki/Tesla,_Inc.
https://en.wikipedia.org/wiki/Nikola_Tesla
'''

P.S - 我写了一篇关于 how to reduce the chance of being blocked while web scraping search engines 的博文。

免责声明,我为 SerpApi 工作。

【讨论】:

    【解决方案2】:

    永远不要使用正则表达式来解析 HTML。

    如果你正确地执行 findall,你应该能够访问每个结果的 href 属性。

    【讨论】:

    • 这是什么傲慢否定的回答? “适当地”?如果你要嘲笑我的技能,你至少可以提供一个解决方案。就像我说的,我是新手。
    • 你的和类似的 cmets 是否意味着这是错误的? youtube.com/watch?v=GEshegZzt3M
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 2021-08-23
    • 2016-07-12
    相关资源
    最近更新 更多