Python/Etree:从元素及其子元素获取文本

0 投票
2 回答
1061 浏览
提问于 2025-04-16 18:05

我需要使用一些这样的HTML:

<li><a href="#">S:</a><a class="#"> (n) </a><a href="#">trial</a>, <a href="#">trial run</a>, <b>test</b>, <a href="#">tryout</a> (trying something to find out about it) <i>"a sample for ten days free trial"; "a trial of progesterone failed to relieve the pain"</i></li>

问题是我需要获取所有子元素的文本(比如标签里的文本)以及文本节点(比如子元素之间的逗号部分)。

我现在只能获取每个子元素的文本并把它们拼在一起(这样能得到所有内容,但缺少文本节点),或者只获取文本节点(这样就得不到标签里的文本)。有没有办法同时获取这两种内容呢?

2 个回答

0

你可以使用 lxml.html 来实现这个功能。

In [1]: import lxml.html

In [2]: el = lxml.html.fromstring('<li><a href="#">S:</a><a class="#"> (n) </a><a href="#">trial</a>, <a href="#">trial run</a>, <b>test</b>, <a href="#">tryout</a> (trying something to find out about it) <i>"a sample for ten days free trial"; "a trial of progesterone failed to relieve the pain"</i></li>')

In [3]: print el.text_content()
S: (n) trial, trial run, test, tryout (trying something to find out about it) "a sample for ten days free trial"; "a trial of progesterone failed to relieve the pain"
1

lxml的更新日志显示,lxml版本2.3可以和Python 3.1.2及更新的版本一起使用。

另外,你可以用正则表达式 re.sub(r'<[^>]*?>', '', val) 来实现类似于PHP中的strip_tags功能。

撰写回答