Python:解析div下的所有元素

0 投票
2 回答
1139 浏览
提问于 2025-04-17 21:41

我正在尝试用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> 标签。

撰写回答