0

我有一个类似 html 的字符串,我想从中提取数据。

s="<ul><li>this is a bullet lev 1&nbsp;</li><li><ul><li><strong>&nbsp;this</strong> is a bullet lev&nbsp;</li></ul></li><li>&nbsp;<ul><li><ul><li>this is a bullet lev 3</li></ul></li></ul></li></ul></ul><strong></li>

"

我想提取包含 <li> 元素的所有数据的内容,这些元素在它们之间包含诸如“这是一个子弹 lev 1”之类的元素,而不是像在多级元素中那样包含其他 <li> 的元素,例如

<li><ul><li><strong>&nbsp;this</strong> is a bullet lev&nbsp;</li></ul></li>

我为此写了一个正则表达式

<li>([\w &;/<>]*?)</li>

然而,这最终也会拉取不需要的数据

<li>this is a bullet lev 1&nbsp;</li>
<li><ul><li><strong>&nbsp;this</strong> is a bullet lev&nbsp;</li>
<li>&nbsp;<ul><li><ul><li>this is a bullet lev 3</li>

虽然我想让它拉

<li>this is a bullet lev 1&nbsp;</li>
<li><strong>&nbsp;this</strong> is a bullet lev&nbsp;</li>
<li>&nbsp;<ul><li><ul><li>this is a bullet lev 3</li>

这个想法是我想排除提取数据中已经有 <li> 的任何结果并继续前进。

从研究中我了解到我可能必须使用前瞻或后视,我尝试了几次但无济于事。

有什么线索吗?我正在使用 python,它内置了 re 模块。

4

2 回答 2

0

我以前从未使用过 BeautifulSoup,但我在 15 分钟内安装了它并且没有阅读任何文档:

>>> s="<ul><li>this is a bullet lev 1&nbsp;</li><li><ul><li><strong>&nbsp;this</strong> is a bullet lev&nbsp;</li></ul></li><li>&nbsp;<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&nbsp;
&nbsp;thisis a bullet lev&nbsp;
&nbsp;this is a bullet lev 3

希望这可以帮助...

于 2013-04-05T16:29:53.190 回答
0

我认为这可能会完成这项工作。

<li>((?!<li>).)*?</li>

只要它们不包含 a (使用前瞻) ,就应该匹配任何<li>后面的内容和中间的任何内容</li><li>

这假设您实际上并不想要<li>&nbsp;<ul><li><ul><li>this is a bullet lev 3</li>,而是:<li>this is a bullet lev 3</li>在您的示例中,这似乎与您的描述更一致。

也就是说,一般来说,解析器对于这类事情确实是一个更好的主意。

于 2013-04-05T16:33:08.953 回答