定位 div 内的跨度以从 google 搜索结果中抓取

问题描述 投票:0回答:3

我正在尝试用 python 构建一个抓取器,但我无法定位多个 div 内的 span 元素。 URL 是 Google 搜索结果,所以让我们以停车为例:

enter image description here

https://www.google.com/search?q=Thomas+Muntzer+Strasse+122+parking+Gamstadt

我想在结果页面中定位此停车场的名称。(屏幕截图上突出显示的元素)

def getPropNames(soup):
    result = soup.findAll('div', class_="BNeawe deIvCb AP7Wnd" )
    for elm in result:
        names.append(elm.text)

我使用了我之前创建的这个函数,但问题是它在网页上获取多个结果并淹没了我的Excel,然后当我用不需要的结果保存它时,我如何才能专门定位多个div中的跨度并且如果没有id?

提前致谢,如果您需要更多信息来解决我的问题,请告诉我! :)

python beautifulsoup
3个回答
0
投票

尝试以下代码来获取span元素。找到父

div
元素,然后使用
find_next('span')

import requests
from bs4 import BeautifulSoup
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36'}
resspons=requests.get("https://www.google.com/search?q=Thomas+Muntzer+Strasse+122+parking+Gamstadt",headers=headers)
soup=BeautifulSoup(resspons.text,'html.parser')
print(soup.find('div',class_='SPZz6b').find_next('span').text)

输出

AirPark Erfurt airport parking Jaritz & Büttner GbR

更新

url_list=['url1','url2']
names=[]
hdr={'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36'}
for url in url_list:
    req = requests.get(url, headers=hdr)
    soup = BeautifulSoup(req.text, 'html.parser')
    try:
        names.append(soup.find('div', class_='SPZz6b').find_next('span').text)
    except:
        names.append("None")

print(names)

0
投票

您可以使用 SelectorGadget Chrome 扩展程序从页面中直观地抓取

CSS
选择器。我创建了 GIF 来演示如何使用您的示例进行操作。

from bs4 import BeautifulSoup
import requests

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"
}
# could be replaced with actual URLs
queries = ['Thomas Muntzer Strasse 122 parking Gamstadt', 'P9 Terminal 2 Parking - Frankfurt Airport', 'london heathrow parking terminal 5']

for query in queries:
    html = requests.get(f'https://www.google.com/search?q={query}', headers=headers)
    soup = BeautifulSoup(html.text, 'html.parser')

    try:
        address = soup.select_one('.hNKfZe span').text
    except:
        address = None
    print(address)

# output:
'''
AirPark Erfurt airport parking Jaritz & Büttner GbR
P9 Terminal 2 Parking - Frankfurt Airport
Heathrow POD Parking Terminal 5
'''

或者,您可以使用 SerpApi 的 Google Search Engine Resutls API 执行相同的操作。这是一个付费 API,可免费试用 5,000 次搜索。

本质上,主要区别在于您拥有现成的数据,您需要迭代并选择您需要的数据,而不是从头开始制作所有内容。

要集成的代码:

from serpapi import GoogleSearch

queries = ['Thomas Muntzer Strasse 122 parking Gamstadt',
           'P9 Terminal 2 Parking - Frankfurt Airport',
           'london heathrow parking terminal 5']

for query in queries:
    params = {
      "api_key": "YOUR_API_KEY",
      "engine": "google",
      "q": query,
      "google_domain": "google.com",
    }

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

    try:
        answer = results['knowledge_graph']['title']
    except:
        answer = None
    print(answer)

# output:
'''
AirPark Erfurt airport parking Jaritz & Büttner GbR
P9 Terminal 2 Parking - Frankfurt Airport
Heathrow POD Parking Terminal 5
'''

免责声明,我为 SerpApi 工作。


0
投票

大家好,几年后我开始怀旧,实际上我在 4 年前就解决了这个问题,但我注意到这篇文章有 600 多个浏览量,但直到现在才找到解决方案,我只是回来解释一下这里发生了什么。

要从 Google 搜索结果中检索特定内容(例如 Thomas-Müntzer-Straße 122 Parking),搜索结果会动态加载,并且需要处理 JavaScript 内容,这意味着需要使用 Selenium 等库。

所以以防万一有人仍然需要它:

从硒导入网络驱动程序

从 selenium.webdriver.common.by 导入

从 selenium.webdriver.chrome.options 导入选项

chrome_options = 选项()

chrome_options.add_argument("--headless") # 运行 Chrome headless(可选)

chromedriver_path = r"C:\Users\kyria\Download

© www.soinside.com 2019 - 2024. All rights reserved.