BeautifulSoup:如何从包含一些嵌套的 <ul>s 的 <ul>s 列表中提取所有 <li>s? [英] BeautifulSoup: How do I extract all the <li>s from a list of <ul>s that contains some nested <ul>s?

查看:21
本文介绍了BeautifulSoup:如何从包含一些嵌套的 <ul>s 的 <ul>s 列表中提取所有 <li>s?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是一个新手程序员,试图通过构建一个脚本来使用 Python,该脚本会抓取 http://en.wikipedia.org/wiki/2000s_in_film 并提取电影名称(年份)"列表.我的 HTML 源代码如下:

I'm a newbie programmer trying to jump in to Python by building a script that scrapes http://en.wikipedia.org/wiki/2000s_in_film and extracts a list of "Movie Title (Year)". My HTML source looks like:

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

I'd like all the li tags following the first h3 tag and stopping at the next h2 tag, including all nested li tags.

firstH3 = soup.find('h3')

...正确地找到了我想开始的地方.

...correctly finds the place I'd like to start.

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

...给我一个列表 uls,每个列表都有我需要的 li 内容.

...gives me a list uls, each with li contents that I need.

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>

但我不确定从这里去哪里.

But I'm unsure of where to go from here.

更新:

最终代码:

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 会抛出包含 UL 的 LI,因为嵌套的 LI 现在是重复的.

The if...break throws out the LI's that contain UL's since the nested LI's are now duplicated.

打印输出现在是:

  • 102 斑点狗 (2000)
  • 10 日和狼(2006)
  • 11:14(2006)
  • 12:08 布加勒斯特以东(2006 年)
  • 13 持续 30 年(2004 年)
  • 1408(2007)
  • ...

推荐答案

.findAll() 适用于嵌套的 li 元素:

.findAll() works for nested li elements:

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>

这篇关于BeautifulSoup:如何从包含一些嵌套的 &lt;ul&gt;s 的 &lt;ul&gt;s 列表中提取所有 &lt;li&gt;s?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆