使用 Beautifulsoup 从网站中提取数据
Posted
技术标签:
【中文标题】使用 Beautifulsoup 从网站中提取数据【英文标题】:Extracting data from website using Beautifulsoup 【发布时间】:2020-03-03 04:20:15 【问题描述】:我正在尝试提取模型名称和有关模型的任何其他详细信息。当我尝试获取文本时,我找不到任何可以用来获取数据的特殊内容。
有人知道如何从这些 url 中获取数据吗?
https://www.audi.de/de/brand/de.html
或https://www.opel.de/auswahlhilfe/modelle.html
我想获取模型列表和任何可用的属性,例如价格。
到目前为止,我正在尝试使用它:
from selenium import webdriver
from bs4 import BeautifulSoup
import pandas as pd
from urllib.request import urlopen
url = "https://www.opel.de/auswahlhilfe/modelle.html"
html = urlopen(url)
text = soup.get_text()
但我没有得到任何有用的东西..这里有专家吗?
【问题讨论】:
【参考方案1】:如果您转到“网络”选项卡,您将获得以下链接,该链接以 json 格式返回值。 你不需要硒来做到这一点。
https://www.opel.de/apps/atomic/getVehicleTeasers.path=L2NvbnRlbnQvb3BlbC93b3JsZHdpZGUvZ2VybWFueS9kZS9pbmRleC9iYXNlYmFsbC1jYXJkcy9iYmMtY29sbGVjdGlvbnMvdmVoaWNsZXMtb25seS1jb2xsZWN0aW9uPuGlIfE.feefoEnabled=false.expandingMenuEnabled=false.json
试试下面的代码。
from bs4 import BeautifulSoup
import requests
import pandas as pd
url='https://www.opel.de/apps/atomic/getVehicleTeasers.path=L2NvbnRlbnQvb3BlbC93b3JsZHdpZGUvZ2VybWFueS9kZS9pbmRleC9iYXNlYmFsbC1jYXJkcy9iYmMtY29sbGVjdGlvbnMvdmVoaWNsZXMtb25seS1jb2xsZWN0aW9uPuGlIfE.feefoEnabled=false.expandingMenuEnabled=false.json'
rs=requests.get(url).json()
html=''.join(rs['bbcTeaser'])
soup=BeautifulSoup(html,'html.parser')
car_name=[]
car_price=[]
for name, price in zip(soup.select('.q-carline'),soup.select('.q-value')):
car_name.append(name.text)
car_price.append(price.text)
df = pd.DataFrame("car_name":car_name,"car_price":car_price)
print(df)
输出:
car_name car_price
0 ADAM € 14.120,00 nur Lagerfahrzeuge
1 ADAM ROCKS € 16.475,00 nur Lagerfahrzeuge
2 ADAM ROCKS S € 20.430,00
3 ADAM S € 19.330,00
4 Ampera-e € 42.990,00
5 Astra 5-Türer € 19.990,00
6 Astra Sports Tourer € 20.990,00
7 Cascada € 33.995,00 nur Lagerfahrzeuge
8 Combo Life € 21.645,00
9 Neuer Corsa € 13.990,00
10 Corsa-e € 29.900,00
11 Corsa 3-Türer € 13.255,00
12 Corsa 5-Türer € 14.055,00
13 Crossland X € 18.750,00
14 Grandland X € 24.700,00
15 Insignia Grand Sport € 28.505,00
16 Insignia GSi € 46.695,00
17 Insignia Sports Tourer € 29.505,00
18 Insignia Country Tourer € 41.385,00
19 KARL € 13.350,00
20 KARL ROCKS € 12.965,00
21 Mokka X € 20.495,00
22 Zafira € 28.495,00
23 Zafira Life € 34.780,00
24 Combo Cargo € 20.230,00
25 Movano Cargo € 27.925,00
26 Movano Doppelkabine € 38.288,25
27 Movano Fahrgestell Normalkabine € 34.777,75
28 Movano Fahrgestell Doppelkabine € 35.967,75
29 Movano Plattformfahrgestell € 34.777,75
30 Movano Kofferaufbau € 46.320,75
31 Movano Pritsche Normalkabine € 37.574,25
32 Movano Pritsche Doppelkabine € 38.764,25
33 Movano Kofferaufbau € 46.320,75
34 Movano Pritsche Normalkabine € 37.574,25
35 Movano Pritsche Doppelkabine € 38.764,25
36 Movano Kipper Normalkabine € 39.894,75
37 Movano Kipper Doppelkabine € 44.178,75
38 Vivaro Cargo € 29.750,00
39 Vivaro Doppelkabine € 33.082,00
40 Vivaro Kombi € 31.237,50
41 Grandland X Hybrid4 € 51.165,00
42 Movano Kombi € 30.905,00
快照:
【讨论】:
太棒了!这就是我想要的:) 谢谢@KunduK @KunduK 我试图找到这个 json url frm 网络,但我找不到那个特定的 url。你能再解释一下吗... 进入网络选项卡后,单击 XHR 选项卡并执行 ctlr+R,您将看到在单击响应选项卡时以 json 格式返回数据的链接。【参考方案2】:使用requests
而不是urllib.request
...
import requests
from bs4 import BeautifulSoup
url = "https://www.opel.de/auswahlhilfe/modelle.html"
r = requests.get(url)
soup = BeautifulSoup(r.text, 'html.parser')
text = soup.get_text()
print(text)
【讨论】:
感谢@Moshe,但我如何生成列表?我正在获取文本及其干净的文本,但不确定如何从中创建模型列表... @MuhammadSalmanShahid 看到 KunduK 的回答......他完成了工作!【参考方案3】:我不确定您是否致力于使用 BeautifulSoup,但您可以使用一些普通的旧 Selenium 来解决这个问题。
使用您提供的 URL https://www.opel.de/auswahlhilfe/modelle.html,这些示例可以帮助您入门。
from selenium import webdriver
from time import sleep
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
# start the driver
driver = webdriver.Chrome()
# navigate to the URL
driver.get("https://www.opel.de/auswahlhilfe/modelle.html")
# invoke WebDriverWait to wait for page to load
# get the model names
model_names = WebDriverWait(driver, 10).until(
EC.presence_of_all_elements_located((By.XPATH, "//a/div/div/div/span[contains(@class, 'q-carline')]")))
for model in model_names:
print(model.text)
获取价格列表:
prices = driver.find_elements_by_xpath("//a/div/div/div/span[contains(@class, 'q-price')]/span[contains(@class, 'q-value')]");
for price in prices:
print(price.text)
【讨论】:
感谢您的回答。您是否因为使用了“驱动程序”而使用任何其他库?name 'driver' is not defined
刚刚出错。
驱动是 Selenium Webdriver。您必须首先实际启动驱动程序。更新了我的代码示例。
谢谢。但仍然出现异常错误:WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home
您需要完全按照错误消息告诉您的操作 - 将 chromedriver.exe 添加到您的 Path 环境变量中。有很多指南和教程可以向您展示如何做到这一点。这是一个:***.com/questions/29858752/…【参考方案4】:
您可以从 json 响应中获取一些数据。只需要通过网络钓鱼你可以从那里得到什么:
import requests
from bs4 import BeautifulSoup
url = 'https://www.opel.de/apps/atomic/getVehicleTeasers.path=L2NvbnRlbnQvb3BlbC93b3JsZHdpZGUvZ2VybWFueS9kZS9pbmRleC9iYXNlYmFsbC1jYXJkcy9iYmMtY29sbGVjdGlvbnMvdmVoaWNsZXMtb25seS1jb2xsZWN0aW9uPuGlIfE.feefoEnabled=false.expandingMenuEnabled=false.json'
jsonData = requests.get(url).json()['bbcTeaser']
for each in jsonData:
soup = BeautifulSoup(each)
carline = soup.find('span', 'class':'q-carline').text
price = soup.find('span', 'class':'q-value').text
print (carline, price)
输出:
ADAM € 14.120,00 nur Lagerfahrzeuge
ADAM ROCKS € 16.475,00 nur Lagerfahrzeuge
ADAM ROCKS S € 20.430,00
ADAM S € 19.330,00
Ampera-e € 42.990,00
Astra 5-Türer € 19.990,00
Astra Sports Tourer € 20.990,00
Cascada € 33.995,00 nur Lagerfahrzeuge
Combo Life € 21.645,00
Neuer Corsa € 13.990,00
Corsa-e € 29.900,00
Corsa 3-Türer € 13.255,00
Corsa 5-Türer € 14.055,00
Crossland X € 18.750,00
Grandland X € 24.700,00
Insignia Grand Sport € 28.505,00
Insignia GSi € 46.695,00
Insignia Sports Tourer € 29.505,00
Insignia Country Tourer € 41.385,00
KARL € 13.350,00
KARL ROCKS € 12.965,00
Mokka X € 20.495,00
Zafira € 28.495,00
Zafira Life € 34.780,00
Combo Cargo € 20.230,00
Movano Cargo € 27.925,00
Movano Doppelkabine € 38.288,25
Movano Fahrgestell Normalkabine € 34.777,75
Movano Fahrgestell Doppelkabine € 35.967,75
Movano Plattformfahrgestell € 34.777,75
Movano Kofferaufbau € 46.320,75
Movano Pritsche Normalkabine € 37.574,25
Movano Pritsche Doppelkabine € 38.764,25
Movano Kofferaufbau € 46.320,75
Movano Pritsche Normalkabine € 37.574,25
Movano Pritsche Doppelkabine € 38.764,25
Movano Kipper Normalkabine € 39.894,75
Movano Kipper Doppelkabine € 44.178,75
Vivaro Cargo € 29.750,00
Vivaro Doppelkabine € 33.082,00
Vivaro Kombi € 31.237,50
Grandland X Hybrid4 € 51.165,00
Movano Kombi € 30.905,00
【讨论】:
以上是关于使用 Beautifulsoup 从网站中提取数据的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 BeautifulSoup 从 Metacritic 网站中提取电影类型
如何使用python和beautifulsoup4循环抓取网站中多个页面的数据
如何通过 Python Selenium BeautifulSoup 从网站中提取证券价格作为文本