我有一个类似html的字符串,我想从中提取数据。
s="<ul><li>this is a bullet lev 1 </li><li><ul><li><strong> this</strong> is a bullet lev </li></ul></li><li> <ul><li><ul><li>this is a bullet lev 3</li></ul></li></ul></li></ul></ul><strong></li>
“
我想提取包含&lt; li&gt;的所有数据的内容元素,这些元素包含它们之间的“这是一个子弹列1”,而不是包含其他&lt; li&gt;的元素。如多层元素,如
<li><ul><li><strong> this</strong> is a bullet lev </li></ul></li>
我为那个
写了一个正则表达式<li>([\w &;/<>]*?)</li>
然而,这最终也会拉出不需要的数据
<li>this is a bullet lev 1 </li>
<li><ul><li><strong> this</strong> is a bullet lev </li>
<li> <ul><li><ul><li>this is a bullet lev 3</li>
虽然我想拉它
<li>this is a bullet lev 1 </li>
<li><strong> this</strong> is a bullet lev </li>
<li> <ul><li><ul><li>this is a bullet lev 3</li>
我的想法是,我要排除已有的任何结果&lt; li&gt;在提取的数据中继续前进。
从研究中我了解到,我可能不得不使用前瞻或后视,我给了它几次尝试但无济于事。
任何线索?我正在使用python,它内置了模块。
答案 0 :(得分:0)
我之前从未使用过BeautifulSoup,但我在15分钟内安装了它并且没有阅读任何文档:
>>> s="<ul><li>this is a bullet lev 1 </li><li><ul><li><strong> this</strong> is a bullet lev </li></ul></li><li> <ul><li><ul><li>this is a bullet lev 3</li></ul></li></ul></li></ul></ul><strong></li>"
>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup(s)
>>> for liRaw in soup.findAll('li'):
... if liRaw.findParent().findParent().name == u'[document]':
... print liRaw.text
this is a bullet lev 1
thisis a bullet lev
this is a bullet lev 3
希望这会有所帮助......
答案 1 :(得分:0)
我认为这可能会起作用。
<li>((?!<li>).)*?</li>
任何<li>
后跟</li>
以及介于两者之间的任何内容,只要它们不包含<li>
(使用lookahead)
这假设您实际上并不想要<li> <ul><li><ul><li>this is a bullet lev 3</li>
,而是在示例中使用<li>this is a bullet lev 3</li>
,这似乎与您的描述更为一致。
那就是说,一般来说,解析器对于这类事情确实是个更好的主意。