【发布时间】:2014-01-15 17:40:27
【问题描述】:
我正在尝试使用 lxml 和 Python 从网站中过滤掉文本,但是,格式可能非常不规则。 (这是一个论坛。)
例如,我可能有:
<a>
<c>
<d>
MARKER some text
</d>
</c>
MARKER other text 1
<b>MARKER other text 2</b>
M<b>ARKE</b>R <e>other</e> text 3
</a>
我希望我的 xpath 返回我:
MARKER other text 1
<b>MARKER other text 2</b>
M<b>ARKE</b>R <e>other</e> text 3
也就是说,我希望能够解析嵌套文本,同时也能返回带有标记的文本。
我目前拥有的是:
filter = "//text()[not(parent::d[parent::c]) and contains(., 'MARKER')]"
filtered = root.xpath(self.vote_xpath)
for i in filtered:
print(i)
其中root 是从字符串解析的元素树,它返回我:
MARKER other text 1
MARKER other text 2
这无法返回带有 MARKER 的最后一个文本,并且无法保持我想要的格式。
我应该如何从这里开始?
编辑: 好的,我一直在摆弄 xpath。
//node()[not(parent::d[parent::c]) and contains(., 'MARKER')]
运行:
<a>
<c>
<d>
some text
</d>
</c>
other text 1
<b>other text 2</b>
M<b>ARKE</b>R <e>other</e> text 3
</a>
成功注册了由<b> 标记分解的MARKER,因为node() 将整个节点传递给contains 过滤器。但是,它作为匹配返回整个父节点,在这种情况下,它只是返回整个 <a> 节点及其所有内容。
我应该如何让 xpath 只返回匹配的部分?
【问题讨论】: