Python:解析div下的所有元素
我正在尝试用beautifulsoup解析所有在div
标签下的元素,但问题是我在解析之前并不知道这个div下面具体有哪些元素。比如,一个div里面可能有段落文本、项目符号格式的内容,还有一些href
链接。每个我打开的url在我关注的特定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 个回答
1
根据Beautiful Soup 的文档,如果你想遍历一个标签的子元素,可以用 .contents 来获取一个列表,或者用 .children(这是一个生成器)。
for child in title_tag.children:
print(child)
所以在你的例子中,你可以获取每个标签的 .text 属性,然后把它们拼接在一起。我不太确定你是想要链接的位置还是只是标签的文本,如果是前者,可以参考这个StackOverflow的问题。
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'
要获取所有链接,可以查找所有带有 href
属性的 a
元素,并把这些链接放到一个列表里:
>>> [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
参数是用来限制搜索范围,只查找那些有 href
属性的 <a>
标签。