![](/img/trans.png)
[英]Get both parent and child text with Xpath (HtmlXPathSelector)
[英]XPATH - get tuples of parent and child
假設這是我的XML:
<animals>
<mammals>
<an>dog</an>
<an>cat</an>
</mammals>
<reptiles>
<an>snake</an>
</reptiles>
</animals>
我想要的是使用xpath
獲得類似的元組:
(mammals,dog)
(mammals,cat)
(reptiles,snake)
要分別獲取它們,或者通過兩個查詢來獲取它們都很容易。 我想知道是否有一種方法可以在1個xpath查詢中獲取它(或非常相似的輸出)。
任何幫助將不勝感激!
使用lxml :
from io import StringIO
from lxml import etree
xml = """<animals>
<mammals>
<an>dog</an>
<an>cat</an>
</mammals>
<reptiles>
<an>snake</an>
</reptiles>
</animals>"""
tree = etree.parse(StringIO(xml))
for x in tree.xpath("/animals/*"):
for y in x:
print((x.tag, y.text))
輸出:
('mammals', 'dog')
('mammals', 'cat')
('reptiles', 'snake')
嘗試在python中使用xml
模塊
from xml.etree import ElementTree
def parse_data(xml_str):
output = []
tree = ElementTree.fromstring(xml_str)
for m in tree.getchildren():
for n in m.getchildren():
output.append((m.tag, n.text,))
return output
xml_str = '''
<animals>
<mammals>
<an>dog</an>
<an>cat</an>
</mammals>
<reptiles>
<an>snake</an>
</reptiles>
</animals>'''
print parse_data(xml_str)
# output: [('mammals', 'dog'), ('mammals', 'cat'), ('reptiles', 'snake')]
在XPath 2.0或以上,你可以使用for
結構( 演示 ):
for $x in /animals/*/*
return concat($x/parent::*/name(), ',', $x/text())
但是在僅支持XPath 1.0的lxml
,我們需要將其替換為python的for
循環:
from lxml import etree
raw = """<animals>
<mammals>
<an>dog</an>
<an>cat</an>
</mammals>
<reptiles>
<an>snake</an>
</reptiles>
</animals>"""
root = etree.fromstring(raw)
for x in root.xpath("/animals/*/*"):
print (x.getparent().tag, x.text)
該xpath返回請求的字符串,但僅返回第一個元素。 使用純XPath可能很難
'concat("(", local-name(//animals/*), ",", //animals/*/an/text(), ")")'
xmllint --xpath 'concat("(", local-name(//animals/*), ",", //animals/*/an/text(), ")")' ~/tmp/test.xml
(mammals,dog)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.