BeautifulSoup: Как извлечь все li из списка ul, содержащего несколько вложенных ul?

Мой исходный код выглядит так:

<h3>Header3 (Start here)</h3>
<ul>
    <li>List items</li>
    <li>Etc...</li>
</ul>
<h3>Header 3</h3>
<ul>
    <li>List items</li>
    <ul>
        <li>Nested list items</li>
        <li>Nested list items</li></ul>
    <li>List items</li>
</ul>
<h2>Header 2 (end here)</h2>

Я бы хотел, чтобы все теги «li» следовали за первым тегом «h3» и останавливались на следующем теге «h2», включая все вложенные теги li.

firstH3 = суп.найти('h3')

правильно находит место, с которого я хотел бы начать.

firstH3 = soup.find('h3') # Start here
uls = []
for nextSibling in firstH3.findNextSiblings():
    if nextSibling.name == 'h2':
        break
    if nextSibling.name == 'ul':
        uls.append(nextSibling)

дает мне список UL, каждый с содержимым LI, которое мне нужно.

ВЫДЕРЖКА ИЗ СПИСКА "uls":

<ul>
...
    <li><i><a href="/wiki/Agent_Cody_Banks" title="Agent Cody Banks">Agent Cody Banks</a></i> (2003)</li>
    <li><i><a href="/wiki/Agent_Cody_Banks_2:_Destination_London" title="Agent Cody Banks 2: Destination London">Agent Cody Banks 2: Destination London</a></i> (2004)</li>
    <li>Air Bud series:
        <ul>
            <li><i><a href="/wiki/Air_Bud:_World_Pup" title="Air Bud: World Pup">Air Bud: World Pup</a></i> (2000)</li>
            <li><i><a href="/wiki/Air_Bud:_Seventh_Inning_Fetch" title="Air Bud: Seventh Inning Fetch">Air Bud: Seventh Inning Fetch</a></i> (2002)</li>
            <li><i><a href="/wiki/Air_Bud:_Spikes_Back" title="Air Bud: Spikes Back">Air Bud: Spikes Back</a></i> (2003)</li>
            <li><i><a href="/wiki/Air_Buddies" title="Air Buddies">Air Buddies</a></i> (2006)</li>
        </ul>
    </li>
    <li><i><a href="/wiki/Akeelah_and_the_Bee" title="Akeelah and the Bee">Akeelah and the Bee</a></i> (2006)</li>
...
</ul>

Но я не уверен, куда идти отсюда. Я новичок в программировании и пытаюсь освоить Python, создав скрипт, который очищает http://en.wikipedia.org/wiki/2000s_in_film и извлекает список «Название фильма (год)».


Обновлять:

Окончательный код:

lis = []
    for ul in uls:
        for li in ul.findAll('li'):
            if li.find('ul'):
                break
            lis.append(li)

    for li in lis:
        print li.text.encode("utf-8")

If-->break отбрасывает LI, содержащие UL, так как вложенные LI теперь дублируются.

Вывод на печать теперь:

  • 102 далматинца (2000)
  • 10 место и волк (2006)
  • 11:14(2006)
  • 12:08 К востоку от Бухареста (2006)
  • 13 из 30 (2004)
  • 1408(2007)
  • ...

Спасибо


person danneu    schedule 06.12.2010    source источник
comment
Вы задаете неправильный вопрос. Вы уже сделали то, что указано в заголовке вашего вопроса, и спрашиваете, как заполнить таблицу/объект/что-то. Пожалуйста, обновите свой вопрос, чтобы отразить это (и укажите, что вы подразумеваете под таблицей - таблица базы данных или словарь или что-то еще, или вы не знаете).   -  person Chris Morgan    schedule 06.12.2010
comment
Я не хотел запутывать свой вопрос последним предложением, поэтому поясню. Теперь у меня есть список ul с дочерними li, которые могут содержать или не содержать вложенных/дочерних ul (с большим количеством li). Я не уверен, как извлечь все lis. Я изменю заголовок, чтобы он лучше отражал вложенный вопрос UL.   -  person danneu    schedule 06.12.2010


Ответы (3)


.findAll() работает для вложенных li элементов:

for ul in uls:
    for li in ul.findAll('li'):
        print(li)

Выход:

<li>List items</li>
<li>Etc...</li>
<li>List items</li>
<li>Nested list items</li>
<li>Nested list items</li>
<li>List items</li>
person jfs    schedule 06.12.2010
comment
print(li.text) будет извлекать элементы без html. - person Nimo1981; 21.08.2020

Понимание списка тоже может работать.

lis = [li for ul in uls for li in ul.findAll('li')]
person zachwill    schedule 06.12.2010

import requests
from bs4 import BeautifulSoup
r = requests.get("https://www.w3schools.com/tags/tryit.asp?filename=tryhtml_list_test")
soup =   BeautifulSoup(r.content,"lxml")
w3schollsList = soup.find_all('body')
for w3scholl in w3schollsList:
    ulList = w3scholl.find_all('li')
    for li in ulList:
        print(li)

Примечание: здесь нужно получить li внутри созданного нами div

person ihsan güç    schedule 04.10.2020