我正在用这个形状解析一个XML文件:
from lxml import etree
mystring='''<div n="0001" type="doc" xml:id="_3168060002">
<p xml:id="_3168060003">[car 1] Séquence préparatoire pour <p xml:id="_3168060005">a) la définition </p></p></p></div>
<div n="0002" type="doc" xml:id="_3168060012"><p xml:id="_3168060003">[blue] la voiture pour <p xml:id="_3168060005">a) la définition </p></p></p></div>我想捕捉div中的任何内容,后面跟着p标记,也包括div的n属性。我的解析策略如下:
parser = etree.XMLParser(resolve_entities=False, strip_cdata=False, recover=True, ns_clean=True)
XML_tree = etree.fromstring(claims_PDM.encode() , parser=parser)
paragraphs = './/div[@n]/p[@xml:id]'
xml_query = paragraphs
all_paras = XML_tree.xpath(xml_query)
for para in all_paras:
print(para.tag)它可以工作,但我不知道如何同时提取p标记中的所有内容,以及div的n属性,因为元素的标记和属性是p的,而不是div的。
是否知道如何访问元素的父元素的属性?
谢谢。
发布于 2022-02-25 01:30:24
考虑在xpath级别上运行<div>,然后分别解析子<p>和属性@n项。下面运行一个列表/字典理解,以返回所需项目的字典列表。此外,示例XML使用一个根标记和额外的</p>结束标记进行了修复:
from lxml import etree
mystring='''\
<root>
<div n="0001" type="doc" xml:id="_3168060002">
<p xml:id="_3168060003">[car 1] Séquence préparatoire pour <p xml:id="_3168060005">a) la définition </p></p>
</div>
<div n="0002" type="doc" xml:id="_3168060012">
<p xml:id="_3168060003">[blue] la voiture pour <p xml:id="_3168060005">a) la définition </p></p>
</div>
</root>'''
parser = etree.XMLParser(
resolve_entities=False, strip_cdata=False, recover=True, ns_clean=True
)
XML_tree = etree.fromstring(mystring, parser=parser)
all_divs = XML_tree.xpath('.//div')
all_divs
div_dict = [
{'div': div.find("p").text if div.find("p") else None,
'n': div.attrib["n"]}
for div in all_divs
]
div_dict
# [{'div': '[car 1] Séquence préparatoire pour ', 'n': '0001'},
# {'div': '[blue] la voiture pour ', 'n': '0002'}]发布于 2022-02-25 12:47:50
一个简单的备选方案:
for car in XML_tree.xpath('//div[@n]'):
print(car.xpath('@n')[0],car.xpath('normalize-space(.//p[@*[local-name()="xml:id"]]/text())'))输出:
0001 [car 1] Séquence préparatoire pour
0002 [blue] la voiture pourhttps://stackoverflow.com/questions/71259765
复制相似问题