Python:解析div下的所有元素

时间:2014-03-10 19:03:52

标签: python html beautifulsoup

我正在尝试使用beautifulsoup解析div下的所有元素,问题是我在解析之前不知道div下面的所有元素。例如,div可以包含段落模式和项目符号格式的文本数据以及一些href元素。我打开的每个网址都可以在我看到的特定div类下面有不同的元素:

示例:

url a可以有以下内容:

<div class='content'>
<p> Hello I have a link </p>

<li> I have a bullet point

<a href="foo.com">foo</a>
</div>

但是url b

可以

<div class='content'>
<p> I only have paragraph </p>

</div>

我开始做这样的事情:

content = souping_page.body.find('div', attrs={'class': 'content})

但如何超越这一点并不是一件容易的事。我希望从所有解析数据中创建一个字符串作为最终结果。

最后,我希望从每个示例中获取以下字符串:

示例1:最终输出

 parse_data = Hello I have a link I have a bullet point 
 parse_links = foo.com

示例2:最终输出

 parse_data = I only have paragraph  

2 个答案:

答案 0 :(得分:2)

您只需使用element.get_text()

获取文字文字
>>> from bs4 import BeautifulSoup
>>> sample1 = BeautifulSoup('''\
... <div class='content'>
... <p> Hello I have a link </p>
... 
... <li> I have a bullet point
... 
... <a href="foo.com">foo</a>
... </div>
... ''').find('div')
>>> sample2 = BeautifulSoup('''\
... <div class='content'>
... <p> I only have paragraph </p>
... 
... </div>
... ''').find('div')
>>> sample1.get_text()
u'\n Hello I have a link \n I have a bullet point\n\nfoo\n'
>>> sample2.get_text()
u'\n I only have paragraph \n'

或者您可以使用element.stripped_strings将其删除一点:

>>> ' '.join(sample1.stripped_strings)
u'Hello I have a link I have a bullet point foo'
>>> ' '.join(sample2.stripped_strings)
u'I only have paragraph'

要获取所有链接,请查找具有a属性的所有href元素,并将其收集到列表中:

>>> [a['href'] for a in sample1.find_all('a', href=True)]
['foo.com']
>>> [a['href'] for a in sample2.find_all('a', href=True)]
[]

href=True参数将搜索范围限制为定义了<a>属性的href代码。

答案 1 :(得分:1)

根据Beautiful Soup docs,迭代标记的子项使用.contents将它们作为列表或.children(生成器)。

for child in title_tag.children:
    print(child)

因此,在您的情况下,例如,您获取每个标记的.text并将其连接在一起。我不清楚你是想要链接位置还是只是标签,如果是前者,请参考这个SO question