тег h4 заключен в класс div - PullRequest
0 голосов
/ 25 мая 2019

У меня проблемы с анализом HTML-элементов с помощью атрибута "div" с помощью Beautifulsoup. Код выглядит так

Мне нужно извлечь то, что находится внутри тега h4, я не смог найти текст 'Ocarrol', так как это случайное значение

find('div',{"class": "carResultRow_OfferInfo_Supplier-wrap "})

При выполнении запроса я вернул None

<div class="carResultRow_OfferInfo_Supplier-wrap ">
<h3 class="carResultRow_OfferInfo_SupplierLabel">Servicio proporcionado por:</h3>
<img src="https://cdn2.rcstatic.com/images/suppliers/flat/ocarrol_logo.gif" title="Ocarrol" alt="Ocarrol">
<h4 style="" xpath="1">Ocarrol</h4>
<a href="InfoPo=0&amp;driversAge=30&amp;os=1" onclick="GAQPush('cboxElement">Términos y condiciones</a>
</div>

ссылка

Добавьте ссылку, мне просто нужно название автомобильной компании, в данном случае Ocarrol, Ocarrol, Hertz, Fit Car Rental..etc

Ответы [ 2 ]

0 голосов
/ 25 мая 2019

Может быть, вы можете использовать селектор CSS вместо поиска?

from bs4 import BeautifulSoup

html = '''<div class="carResultRow_OfferInfo_Supplier-wrap ">
<h3 class="carResultRow_OfferInfo_SupplierLabel">Servicio proporcionado por:</h3>
<img src="https://cdn2.rcstatic.com/images/suppliers/flat/ocarrol_logo.gif" title="Ocarrol" alt="Ocarrol">
<h4 style="" xpath="1">Ocarrol</h4>
<a href="InfoPo=0&amp;driversAge=30&amp;os=1" onclick="GAQPush('cboxElement">Términos y condiciones</a>
</div>'''
soup = BeautifulSoup(html, 'lxml')

print(soup.select('div[class="carResultRow_OfferInfo_Supplier-wrap"]'))

печать:

[<div class="carResultRow_OfferInfo_Supplier-wrap">
<h3 class="carResultRow_OfferInfo_SupplierLabel">Servicio proporcionado por:</h3>
<img alt="Ocarrol" src="https://cdn2.rcstatic.com/images/suppliers/flat/ocarrol_logo.gif" title="Ocarrol"/>
<h4 style="" xpath="1">Ocarrol</h4>
<a href="InfoPo=0&amp;driversAge=30&amp;os=1" onclick="GAQPush('cboxElement">Términos y condiciones</a>
</div>]
0 голосов
/ 25 мая 2019

Я предполагаю, что вы используете BeautifulSoup 4.7+. Некоторые атрибуты в Beautiful Soup обрабатываются немного по-особенному, и в 4.7 конечный результат немного отличается от того, что было в <= 4.6. </p>

Атрибуты, которые обычно обрабатываются как списки, разделенные пробелами, обрабатываются немного иначе, чем все остальные атрибуты. class оказывается одним из этих атрибутов, который обычно обрабатывается как разделенные пробелами списки. BeautifulSoup на самом деле хранит эти атрибуты не так, как они есть в HTML-документе, но фактически сохраняет их как список классов (удаленные пробелы): "class1 class2 " -> ['class1', 'class2']. Когда ему нужно оценить атрибут класса как строку, он повторно собирает класс, соединяя каждое значение с пробелом между ними, но замечает, что такие вещи, как конечные пробелы, больше не присутствуют: "class1 class2".

Теперь я не утверждаю, что это интуитивно понятное занятие, а только то, что делает BeautifulSoup. Лично я предпочел бы, чтобы BeautifulSoup сохранял их как исходную строку, а затем разбивал их по списку при необходимости, но это не то, что они делают.

Теперь в BeautifulSoup <= 4.6, я считаю, что конечный пробел сохраняется, но имеет ряд других причуд. Но в вашем случае, 4.7+, вам просто нужно предположить, что конечные и начальные пробелы игнорируются и что пробел свернут в одно пространство между классами. Так что, в вашем случае, просто оставьте пробел позади. </p>

soup.find('div',{"class": "carResultRow_OfferInfo_Supplier-wrap"})

Подробнее об этом поведении можно прочитать здесь: https://bugs.launchpad.net/beautifulsoup/+bug/1824502.


Пример

from bs4 import BeautifulSoup

html = """
<div class="carResultRow_OfferInfo_Supplier-wrap ">
<h3 class="carResultRow_OfferInfo_SupplierLabel">Servicio proporcionado por:</h3>
<img src="https://cdn2.rcstatic.com/images/suppliers/flat/ocarrol_logo.gif" title="Ocarrol" alt="Ocarrol">
<h4 style="" xpath="1">Ocarrol</h4>
<a href="InfoPo=0&amp;driversAge=30&amp;os=1" onclick="GAQPush('cboxElement">Términos y condiciones</a>
</div>
"""

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

print(soup.find('div',{"class": "carResultRow_OfferInfo_Supplier-wrap"}).find('h4'))

выход

<h4 style="" xpath="1">Ocarrol</h4>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...