按标签拆分HTML(或XML)节点文本

时间:2014-03-31 13:15:44

标签: html xml regex

我有一些看起来像这样的HTML:

<div>
Bla bla bla <b>bold stuff</b> Bla bla.
But somewhere else the words bold stuff may appear not in bold
</div>

我想解析此文本以提取粗体元素,将非粗体元素解析为单独的列表:

bolds = ['bold stuff']
normal_test = [
    'Bla bla bla ', 
    'Bla bla.\nBut somewhere else the words bold stuff may appear not in bold'
]

我可能是愚蠢的,但我无法弄清楚如何使用“标准”html解析器来做到这一点。

我可以提取元素的全文,包括粗体,我可以提取粗体,但我发现无法弄清楚每个粗体之前和之后的文本是什么,因为可能存在问题非粗体字符串。

我正在使用lxml,但愿意考虑使用其他解析器的解决方案,或者我不知道的任何聪明的xpath选择器......

但是,否则,我将采用正则表达式......我们都知道,这将是the end of the world

有人可以在太晚之前拯救地球吗?

1 个答案:

答案 0 :(得分:1)

所以我认为这是不可能的,但事实证明,如果你使用正确的库,那就不太难了。

使用BeautifulSoup 4,您可以使用.children属性:

html = '''<div>
Bla bla bla <b>bold stuff</b> Bla bla.
But somewhere else the words bold stuff may appear not in bold
</div>'''
import bs4
soup = bs4.BeautifulSoup(html)
print(list(soup.div.children))
[u'\nBla bla bla ',
 <b>bold stuff</b>,
 u' Bla bla.\nBut somewhere else the words bold stuff may appear not in bold\n']

从那以后实现我想要的东西是相当微不足道的。

如果有人能用lxml做这件事,我还有兴趣吗?