使用Beautiful Soup - Python在HTML中查找1级内的所有文本

时间:2013-06-10 18:42:11

标签: python html-parsing beautifulsoup findall

我需要使用美丽的汤来完成以下任务

示例HTML

<div id = "div1">
 Text1
 <div id="div2>
   Text2
   <div id="div3">
    Text3
   </div>
 </div>
</div>

我需要对此进行搜索,以便在列表的单独实例中返回给我

Text1
Text2
Text3

我尝试做一个findAll('div'),但是它多次重复相同的Text,即它会返回

Text1 Text2 Text3
Text2 Text3
Text3

1 个答案:

答案 0 :(得分:1)

嗯,问题是.text还包括来自所有子节点的文本。您必须手动只获取那些 immediate 节点子节点的文本节点。此外,给定的文本节点内可能有多个文本节点,例如:

<div>
    Hello
        <div>
            foobar
        </div>
    world!
</div>

您希望如何将它们连接起来?这是一个用空格连接它们的函数:

def extract_text(node):
    return ' '.join(t.strip() for t in node(text=True, recursive=False))

用我的例子:

In [27]: t = """
<div>
    Hello
        <div>
            foobar
        </div>
    world!
</div>"""

In [28]: soup = BeautifulSoup(t)

In [29]: map(extract_text, soup('div'))
Out[29]: [u'Hello world!', u'foobar']

你的例子:

In [32]: t = """
<div id = "div1">
 Text1
 <div id="div2">
   Text2
   <div id="div3">
    Text3
   </div>
 </div>
</div>"""

In [33]: soup = BeautifulSoup(t)

In [34]: map(extract_text, soup('div'))
Out[34]: [u'Text1 ', u'Text2 ', u'Text3']