Beautifulsoup 将标签中的文本通过 <br/> 拆分

Posted

技术标签:

【中文标题】Beautifulsoup 将标签中的文本通过 <br/> 拆分【英文标题】:Beautifulsoup split text in tag by <br/> 【发布时间】:2015-08-22 01:24:14 【问题描述】:

是否可以通过 br 标签从标签中拆分文本?

我有这个标签内容:[u'+420 777 593 531', &lt;br/&gt;, u'+420 776 593 531', &lt;br/&gt;, u'+420 775 593 531']

我只想得到数字。 有什么建议吗?

编辑:

[x for x in dt.find_next_sibling('dd').contents if x!=' <br/>']

根本不工作。

【问题讨论】:

为什么不从标签中获取文本? 不,因为当x 是一个元素时,它不等于一个字符串。 【参考方案1】:

您需要测试标签,这些标签被建模为Element 实例。 Element 对象具有 name 属性,而文本元素没有(它们是 NavigableText 实例):

[x for x in dt.find_next_sibling('dd').contents if getattr(x, 'name', None) != 'br']

由于您在该 &lt;dd&gt; 元素中似乎只有文本和 &lt;br /&gt; 元素,因此您不妨改为使用 all the contained strings:

list(dt.find_next_sibling('dd').stripped_strings)

演示:

>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup('''\
... <dt>Term</dt>
... <dd>
...     +420 777 593 531<br/>
...     +420 776 593 531<br/>
...     +420 775 593 531<br/>
... </dd>
... ''')
>>> dt = soup.dt
>>> [x for x in dt.find_next_sibling('dd').contents if getattr(x, 'name', None) != 'br']
[u'\n    +420 777 593 531', u'\n    +420 776 593 531', u'\n    +420 775 593 531', u'\n']
>>> list(dt.find_next_sibling('dd').stripped_strings)
[u'+420 777 593 531', u'+420 776 593 531', u'+420 775 593 531']

【讨论】:

【参考方案2】:

get_text(strip=True, separator='\n')str.splitlines 一起使用:

from bs4 import BeautifulSoup

soup = BeautifulSoup('''\
<dt>Term</dt>
<dd>
    +420 777 593 531<br/>
    +420 776 593 531<br/>
    +420 775 593 531<br/>
</dd>
''', 'html.parser')
print(soup.dd.get_text(strip=True, separator='\n').splitlines())
# ['+420 777 593 531', '+420 776 593 531', '+420 775 593 531']

【讨论】:

【参考方案3】:
tag =  BeautifulSoup('''
<dd>
    +420 777 593 531<br/>
    +420 776 593 531<br/>
    +420 775 593 531<br/>
</dd>
''', 'html.parser')

将其转换为字符串

str_tag = str(tag)

现在使用&lt;br/&gt;标签拆分并转换回BeautifulSoup并从中提取文本

numbers = [BeautifulSoup(_,'html.parser').text.strip() for _ in str(soup).split('<br/>')]
# output : ['+420 777 593 531', '+420 776 593 531', '+420 775 593 531', '']

【讨论】:

以上是关于Beautifulsoup 将标签中的文本通过 <br/> 拆分的主要内容,如果未能解决你的问题,请参考以下文章

使用 BeautifulSoup 查找包含特定文本的 HTML 标签

用beautifulsoup通过div标签查找div文本

Python BeautifulSoup 使用标签中的文本并存储为变量

Python BeautifulSoup 获取文本第一个标签

在 Python 中使用 BeautifulSoup 从脚本标签中提取文本

BeautifulSoup4搜索标签由文本正则表达式