BeautifulSoup:如何从包含一些嵌套<ul>的<ul>列表中提取所有<li>?</ul> </ul> </li>

时间:2010-12-06 03:39:51

标签: python screen-scraping beautifulsoup

我的源代码如下:

<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>

我想在第一个“h3”标记后面的所有“li”标记,并停在下一个“h2”标记,包括所有嵌套的li标记。

  

firstH3 = soup.find('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>

但我不确定从这里去哪里。我是一个新手程序员,试图通过构建一个擦除http://en.wikipedia.org/wiki/2000s_in_film的脚本并提取“电影标题(年份)”列表来跳转到Python。


更新

最终代码:

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 - &gt; break会抛出包含UL的LI,因为嵌套的LI现在已经重复了。

现在打印输出:

  
      
  • 102达尔马提亚人(2000)
  •   
  • 10th&amp;沃尔夫(2006)
  •   
  • 11时14分(2006)
  •   
  • 布加勒斯特东部12:08(2006)
  •   
  • 13继续30(2004)
  •   
  • 1408(2007)
  •   
  • ...
  •   

由于

3 个答案:

答案 0 :(得分:18)

.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>

答案 1 :(得分:9)

列表理解也可以起作用。

lis = [li for ul in uls for li in ul.findAll('li')]

答案 2 :(得分:0)

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)

注意:这是在我们制作的div内获取“ li”