如何使用BeautifulSoup从节包装器中获取类值

时间:2019-05-08 00:06:48

标签: python web-scraping beautifulsoup

我正在尝试从汽车经销商网站上抓取一些数据。这是我目前正在尝试获取有关以下数据的随机车:https://www.bilbasen.dk/brugt/bil/audi/a4/20-tfsi-190-sport-s-tr-4d/4126406

当试图讨价还价时,我遇到了一个问题。价格包装在一个部分中,并分为class = value和class = label。我对这个价值感兴趣。

当前,我的代码如下:

url = 'https://www.bilbasen.dk/brugt/bil/audi/a4/20-tfsi-190-sport-s-tr-4d/4126406'
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}

import requests
from bs4 import BeautifulSoup


r = requests.get(url, headers=headers)
soup = BeautifulSoup(r.text, 'html.parser')

car_price = soup.find(id = "bbVipPrice")
print(car_price)

但是结果看起来像这样:

<section class="section" id="bbVipPrice">
<p id="bbVipPricePrice">
<span class="label">Pris</span>
<span class="value">409.000</span>
</p>
<p data-container="body" data-content="&lt;p&gt;Bilbasen kan som Danmarks førende brugtbils-site udregne markedets mest præcise gennemsnitspris. Dette gøres ved at sammenligne tilsvarende bilers årgang og pris, vægtet i forhold til kørte km.&lt;/p&gt;&lt;p&gt;Gennemsnittet på &lt;b&gt;kr. 410.000&lt;/b&gt; er udregnet udfra 7 &lt;b&gt;Audi A4 2,0 TFSi 190 Sport S-tr. 2017-2019&lt;/b&gt;, reg. &lt;b&gt;2018&lt;/b&gt; heraf 6 til salg og 1 solgt de sidste tre måneder og vægtet i forhold til kørte km.&lt;/p&gt;

&lt;p&gt;NB: Gennemsnitsprisen er vejledende. Forhold som stand og ekstraudstyr er ikke regnet med. Gennemsnittet er for forhandlerbiler.&lt;/p&gt;
" data-original-title="Vægtet Gennemsnitspris" data-toggle="popover" id="bbVipPriceAverage" onclick="BilBasen.Tracking.Analytics.trackEvent('vip', 'info average price');" rel="popover">
<span class="label labelStyleSmall bb-vip-average-price-label">gns.
                <span class="bb-vip-average-price">410.000</span>
<img class="bb-vip-popover-icon" src="/Public/images/ico-tooltip.png"/>
</span>
</p>
</section>

我想获取内部的值:<span class="value">409.000</span> of 409.000。谁能帮助我调整代码?

4 个答案:

答案 0 :(得分:1)

将最后两行更改为:

car_price = soup.find_all('span',class_='value')
print(car_price[0])

您的输出是:

<span class="value">409.000</span>

答案 1 :(得分:1)

car_price = [x.get_text() for x in soup.find_all('span', class_ = 'value')]

答案 2 :(得分:1)

您还可以从字符串中对价格进行正则表达式

import requests
import re

r = requests.get('https://www.bilbasen.dk/brugt/bil/audi/a4/20-tfsi-190-sport-s-tr-4d/4126406', headers = {'User-Agent' : 'Mozilla/5.0'})
p = re.compile(r'"listingValue":"(\d+)"')
price = p.findall(r.text)[0]
print(price)

没有捕获组:

import requests
import re

r = requests.get('https://www.bilbasen.dk/brugt/bil/audi/a4/20-tfsi-190-sport-s-tr-4d/4126406', headers = {'User-Agent' : 'Mozilla/5.0'})
p = re.compile(r'(?<="listingValue":")(?:\d+)')
print(p.findall(r.text))

答案 3 :(得分:1)

您尝试提取的目标上存在的直接元素。您可以使用类似以下的内容

car_price_chunk = soup.find('p',{'id':'bbVipPricePrice'})

完整的代码如下,

url = 'https://www.bilbasen.dk/brugt/bil/audi/a4/20-tfsi-190-sport-s-tr-4d/4126406'
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}
import requests
from bs4 import BeautifulSoup
r = requests.get(url, headers=headers)
soup = BeautifulSoup(r.text, 'html.parser')
car_price_chunk = soup.find('p',{'id':'bbVipPricePrice'})
if car_price_chunk:
    car_price = car_price_chunk.text.replace('Pris','').strip()
    print(car_price)

说明

希望您需要以下块中的内容,并且如果您选中

标记上存在且其标识符为 bbVipPricePrice 的目标元素。为此,您可以使用选择或查找方法。

<p id="bbVipPricePrice">
<span class="label">Pris</span>
<span class="value">409.000</span>
</p>

结果为您 409.000