Соответствуйте точному классу в html <div>тегах, используя BeautifulSoup - PullRequest
3 голосов
/ 12 марта 2019

Я использую Beautiful Soup для сбора информации с сайта.

Соответствующий код:

page_url = https://www.autotrader.co.uk/car-search?sort=sponsored&radius=1500&postcode=&onesearchad=Used&onesearchad=Nearly%20New&onesearchad=New&make=Vauxhall&model=Corsa&year-from=2008&year-to=2010&minimum-mileage=82376&maximum-mileage=123564&page=2

page = urllib2.urlopen(page_url)

soup = BeautifulSoup(page, 'html.parser')

Теперь я просто хочу напечатать каждую цену на странице, которая находится внутри тегов <div class="vehicle-price"></div>, например:

<div class="vehicle-price" data-label="search appearance click">\xa34,400</div>

Поэтому я использую:

for i in soup.select('div.vehicle-price'):
    print (i.string)

Это прекрасно работает, КРОМЕ этого есть <div> тегов, подобных этому:

<div class="vehicle-price physical-stock-mrrp" data-label="search 
appearance click new car">

И код все еще печатает то, что находится внутри этих тегов.

Как я могу сказать Beautiful Soup, что я хочу, чтобы содержимое тега было только тогда, когда class="vehicle-price", а не когда class="vehicle-price other-things-too"?

Ответы [ 2 ]

3 голосов
/ 13 марта 2019

Вы можете использовать пользовательскую функцию , чтобы сопоставить все div только с vehicle-price классом.

html="""
<div class="vehicle-price" data-label="search appearance click">\xa34,400</div>
<div class="vehicle-price physical-stock-mrrp" data-label="search
appearance click new car">
</div>
"""
from bs4 import BeautifulSoup,Tag
import re
soup=BeautifulSoup(html,'lxml')
def my_match_function(elem):
 if isinstance(elem,Tag) and elem.name=='div' and ''.join(elem.attrs['class'])=='vehicle-price':
     return True
print(soup.find_all(my_match_function))

выход

[<div class="vehicle-price" data-label="search appearance click">£4,400</div>]
3 голосов
/ 12 марта 2019

Вы можете использовать : not () CSS псевдокласс , чтобы исключить другой класс

.vehicle-price:not(.physical-stock-mrrp)

BeautifulSoup 4.7.1

Вы можете связать с Or синтаксис для примера.Пример цепочки будет .vehicle-price:not(.physical-stock-mrrp), .vehicle-price:not(.somethingElse).Другие идеи селектора могут включать передачу атрибута = значение селектора и использование операторов ^, *, $ для указания подстрок, которые должны совпадать в значениях атрибута.По-видимому, благодаря @facelessuser вы также можете передавать списки селекторов на :not.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...