Python 检测一个元素的直接同级是文本还是lxml中的另一个元素
我正在使用lxml库和python2.7解析xml文件。我需要检测是否兄弟元素之间没有任何文本。例如,在以下xml部分:Python 检测一个元素的直接同级是文本还是lxml中的另一个元素,python,xml,python-2.7,lxml,Python,Xml,Python 2.7,Lxml,我正在使用lxml库和python2.7解析xml文件。我需要检测是否兄弟元素之间没有任何文本。例如,在以下xml部分: <cross-ref> [t1] </cross-ref> ***some text*** <cross-ref> [t2] </cross-ref> <cross-ref> [t3] </cross-ref><cross-ref> [t4] </cross-ref> 我需要
<cross-ref> [t1] </cross-ref> ***some text*** <cross-ref> [t2] </cross-ref>
<cross-ref> [t3] </cross-ref><cross-ref> [t4] </cross-ref>
我需要修改它,使输出仅为
[t3]
我使用tail属性解决了这个问题。当c.tail为None时,我可以说to元素之间没有文本。代码如下所示:
for c in cross_refs:
if c.getnext() != None:
if c.getnext().tag == c.tag:
if c.tail == None:
print c.text
答案中的三重嵌套
if
s也可以用XPath表示,如下所示:
following-sibling::node()[1][self::cross-ref]
for c in cross_refs:
if c.xpath('boolean(following-sibling::node()[1][self::cross-ref])'):
print c.text
简而言之,只有当XPath是cross-ref
元素时,它才会返回最近的后续同级节点。请注意,这里的节点表示文本节点或元素节点。XPath可以按如下方式使用:
following-sibling::node()[1][self::cross-ref]
for c in cross_refs:
if c.xpath('boolean(following-sibling::node()[1][self::cross-ref])'):
print c.text
或者,如果愿意,您可以首先获得符合此标准的交叉引用元素:
cross_refs = tree.xpath('//cross-ref[following-sibling::node()[1][self::cross-ref]]')
for c in cross_refs:
print c.text
如果不区分文本和元素,那么使用此代码有什么意义?主要问题是,我不希望将它们之间有文本的元素检测为兄弟元素。可能我不清楚。我的意思是,下面的位“不区分文本和元素”:后面的同级::node()[1]
,但接下来的位只进一步过滤到交叉引用
元素:[self::交叉引用]
。因此,如果下一个cross-ref
元素直接位于当前cross-ref
之后,则整个表达式将返回下一个cross-ref
元素,然后可以使用该元素解决您遇到的问题mentioned@AliGH:使用har07的XPath,您可以使用[elt.text for elt in tree.XPath('//cross-ref[following sibling::*[1][self::cross ref]]”如果elt.tail为None]
。