【问题标题】:Beautifulsoup split text in tag by <br/>Beautifulsoup 将标签中的文本通过 <br/> 拆分
【发布时间】:2015-08-22 01:24:14
【问题描述】:
是否可以通过 br 标签从标签中拆分文本?
我有这个标签内容:[u'+420 777 593 531', <br/>, u'+420 776 593 531', <br/>, u'+420 775 593 531']
我只想得到数字。
有什么建议吗?
编辑:
[x for x in dt.find_next_sibling('dd').contents if x!=' <br/>']
根本不工作。
【问题讨论】:
标签:
python
text
tags
beautifulsoup
newline
【解决方案1】:
您需要测试标签,这些标签被建模为Element 实例。 Element 对象具有 name 属性,而文本元素没有(它们是 NavigableText 实例):
[x for x in dt.find_next_sibling('dd').contents if getattr(x, 'name', None) != 'br']
由于您在该 <dd> 元素中似乎只有文本和 <br /> 元素,因此您不妨改为使用 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)
现在使用<br/>标签拆分并转换回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', '']