【问题标题】:BeautifulSoup script parsing Google search results stopped working解析 Google 搜索结果的 BeautifulSoup 脚本停止工作
【发布时间】:2011-02-03 14:22:41
【问题描述】:

我想用 Python 解析 Google 搜索结果。一切都很完美,但现在我不断收到一个空列表。以下是以前可以正常工作的代码:

query = urllib.urlencode({'q': self.Tagsinput.GetValue()+footprint,'ie': 'utf-8', 'num':searchresults, 'start': '100'})
result = url + query1
myopener = MyOpener()
page = myopener.open(result)
xss = page.read()
soup = BeautifulSoup.BeautifulSoup(xss)
contents = [x['href'] for x in soup.findAll('a', attrs={'class':'l'})]

这个脚本在 12 月运行良好,现在停止运行。

据我了解,问题出在这一行:

contents = [x['href'] for x in soup.findAll('a', attrs={'class':'l'})]

当我打印内容时,程序返回一个空列表:[]

请任何人帮忙。

【问题讨论】:

  • 您是否尝试向正常的谷歌搜索网络界面发出自动请求?如果他们阻止了你,你一点也不应该感到惊讶。使用他们的 API。
  • 不是这样:Soup 结果存在,我就是无法解析 Soup。
  • Google 会定期以细微的方式更改首页的布局。如果您致力于解析原始 HTML 的错误想法,您可能只需要在重新设计后弄清楚新属性是什么。倒掉汤,然后寻找新的方法来识别它。

标签: python beautifulsoup


【解决方案1】:

The API 也工作得更好。您可以轻松解析和操作的简单 JSON。

import urllib, json
BASE_URL = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&'
url = BASE_URL + urllib.urlencode({'q' : SearchTerm.encode('utf-8')})
raw_res = urllib.urlopen(url).read()
results = json.loads(raw_res)
hit1 = results['responseData']['results'][0]
prettyresult = ' - '.join((urllib.unquote(hit1['url']), hit1['titleNoFormatting']))

【讨论】:

    【解决方案2】:

    在撰写此答案时,您无需解析 <script> 标记(大部分情况下)即可从 Google 搜索中获取输出。这可以通过使用beautifulsouprequestslxml 库来实现。

    获取online IDE中的标题、链接和示例的代码:

    import requests, lxml
    from bs4 import BeautifulSoup
    
    headers = {
        "User-Agent":
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3538.102 Safari/537.36 Edge/18.19582"
    }
    
    html = requests.get(f'https://www.google.com/search?q=minecraft', headers=headers).text
    soup = BeautifulSoup(html, 'lxml')
    
    for container in soup.findAll('div', class_='tF2Cxc'):
        title = container.select_one('.DKV0Md').text
        link = container.find('a')['href']
        print(f'{title}\n{link}')
    
    # part of the output:
    '''
    Minecraft Official Site | Minecraft
    https://www.minecraft.net/en-us/
    Minecraft Classic
    https://classic.minecraft.net/
    '''
    

    或者,您也可以使用来自 SerpApi 的 Google Search Engine Results API 来完成此操作。这是一个付费 API,可免费试用 5,000 次搜索。查看Playground

    要集成的代码:

    from serpapi import GoogleSearch
    import os
    
    params = {
      "api_key": os.getenv("API_KEY"), # environment for API_KEY
      "engine": "google",
      "q": "minecraft",
    }
    
    search = GoogleSearch(params)
    results = search.get_dict()
    
    for result in results['organic_results']:
      title = result['title']
      link = result['link']
      print(f'{title}\n{link}')
    
    # part of the output:
    '''
    Minecraft Official Site | Minecraft
    https://www.minecraft.net/en-us/
    Minecraft Classic
    https://classic.minecraft.net/
    '''
    

    免责声明,我为 SerpApi 工作。

    【讨论】:

      猜你喜欢
      • 2020-06-19
      • 1970-01-01
      • 2015-11-23
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多