2014-03-31 51 views
0
节点文本

我有一些HTML,看起来像这样:拆分HTML(或XML)通过标签

<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

有人可以拯救地球之前,为时已晚?

+0

[这可能很难,但可能](http://stackoverflow.com/a/4234491/471272)。 – tchrist

回答

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做到这一点?