我正在尝试用 python 构建一个抓取器,但我无法定位多个 div 内的 span 元素。 URL 是 Google 搜索结果,所以让我们以停车为例:
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?
提前致谢,如果您需要更多信息来解决我的问题,请告诉我! :)
尝试以下代码来获取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)
您可以使用 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 工作。
大家好,几年后我开始怀旧,实际上我在 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