Как получить значение класса из оболочки раздела с BeautifulSoup - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь собрать некоторые данные с сайта автодилера. Это случайная машина, о которой я сейчас пытаюсь получить данные: https://www.bilbasen.dk/brugt/bil/audi/a4/20-tfsi-190-sport-s-tr-4d/4126406

Пытаясь пересмотреть цену, я сталкиваюсь с проблемой. Цена заключена в раздел и разделена на класс = значение и класс = метка. Я заинтересован в стоимости.

В настоящее время мой код выглядит так:

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> из 409.000. Может ли кто-нибудь помочь мне настроить мой код?

Ответы [ 4 ]

1 голос
/ 08 мая 2019

Прямой элемент, присутствующий на цели, которую вы пытаетесь извлечь.Вы можете использовать что-то вроде ниже,

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)

Пояснение

Надеюсь, вам требуется контент из нижеchunk, и если вы проверяете целевой элемент, присутствующий в теге и чей идентификатор равен bbVipPricePrice .для этого вы можете использовать метод select или find.

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

В результате вы получите 409.000

1 голос
/ 08 мая 2019
car_price = [x.get_text() for x in soup.find_all('span', class_ = 'value')]
1 голос
/ 08 мая 2019

Вы также можете вывести цену из строки

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))
1 голос
/ 08 мая 2019

Измените последние две строки на:

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

И ваш вывод:

<span class="value">409.000</span>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...