Как мне погрузиться в несколько уровней в Beautiful Soup (ошибка find_all) - PullRequest
0 голосов
/ 15 июня 2019

Я пытаюсь развернуть два уровня в этом скрипте Python.Все примеры, которые я вижу, детализируют один уровень с помощью find_all, и я могу заставить это работать нормально, но я не могу перейти на третий уровень.Вот мой фрагмент кода:

main_table = soup.find("div",attrs={'class':'block-content'})
label_item_contents = main_table.find_all("div", attrs={'class':'label-item-description'})
links = label_item_contents.find_all("a")
print(links)

При этом возникает ошибка «AttributeError: ResultSet объект не имеет атрибута« find_all ».»

Если я закомментирую и изменю печать, так чтоэто:

main_table = soup.find("div",attrs={'class':'block-content'})
label_item_contents = main_table.find_all("div", attrs={'class':'label-item-description'})
print(label_item_contents)

Тогда я вижу все данные соскоб.Я прочитал, что проблема может заключаться в том, что label_item_contents становится массивом, поэтому я попытался сделать это:

links = label_item_contents[].find_all("a")

Но затем я получаю «SyntaxError: неверный синтаксис»

Любая помощь приветствуется!

РЕДАКТИРОВАТЬ: Вот часть HTML, который возвращается во втором примере, когда я использую print (label_item_contents):

<div class="label-item-description">
    <div>
        <a href="/label/example.com"><strong>Example</strong></a>
    </div>
    <small>
        <i class="fa fa-facebook-official"></i> 342.4K
        <i class="fa fa-soundcloud"></i> 233.4K
    </small>
    <br />
    <small class="text-muted">
        Stockholm, Sweden
    </small>
    <br />
    <small class="text-muted">
        <b>Techno, Tech House</b>
    </small>
</div>, <div class="label-item-description">

Я пытаюсь добраться только до <a href="/label/example.com">

Ответы [ 4 ]

2 голосов
/ 15 июня 2019

Вы можете попробовать CSS-селекторы - я обнаружил, что они более знакомы и, что важно, я обнаружил, что они вызывают меньше проблем AttributeError.

Например, используя вышеуказанное значение html, вы можете выбрать первый тег привязки, например:

link = soup.select("div.label-item-description > div > a")
print(link[0]) # <a href="/label/example.com"><strong>Example</strong></a>

См. Документы:

https://www.crummy.com/software/BeautifulSoup/bs4/doc/#css-selectors

0 голосов
/ 15 июня 2019

Два других варианта, которые вы можете использовать:

links = [item['href'] for item in soup.select('.label-item-description a')]
links2 = [item['href'] for item in soup.select('.label-item-description [href^="/label/"]')]
0 голосов
/ 15 июня 2019

Иногда мы используем тег привязки, но он не содержит атрибута href.

Вы можете попробовать функцию find_all, она всегда возвращает список и использование атрибута href=True с тегом привязки даст вам все ссылки, которые имеют атрибут href.

main_table = soup.find("div",{'class':'label-item-description'})
links = main_table.find_all("a",href=True)
print(links)
0 голосов
/ 15 июня 2019

Не уверен, что это правильно, но почему бы не сделать это? Вы можете связать find, чтобы перейти к нужному подпункту:

html= """
<div class="block-content">
    <div class="label-item-description">
        <div>
            <a href="/label/example.com"><strong>Example</strong></a>
        </div>
        <small>
            <i class="fa fa-facebook-official"></i> 342.4K
            <i class="fa fa-soundcloud"></i> 233.4K
        </small>
        <br />
        <small class="text-muted">
            Stockholm, Sweden
        </small>
        <br />
        <small class="text-muted">
            <b>Techno, Tech House</b>
        </small>
    </div>, <div class="label-item-description"></div>
</div>  """

soup=BeautifulSoup(html)
print(soup.find('div', {'class': 'block-content'}).find('div',  {'class':"label-item-description"}).find('a'))

Выход:

<a href="/label/example.com"><strong>Example</strong></a>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...