首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python访问使用xpath解析XML的标记的属性

python访问使用xpath解析XML的标记的属性
EN

Stack Overflow用户
提问于 2022-02-25 00:32:43
回答 2查看 83关注 0票数 -1

我正在用这个形状解析一个XML文件:

代码语言:javascript
运行
复制
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属性。我的解析策略如下:

代码语言:javascript
运行
复制
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的。

是否知道如何访问元素的父元素的属性?

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2022-02-25 01:30:24

考虑在xpath级别上运行<div>,然后分别解析子<p>和属性@n项。下面运行一个列表/字典理解,以返回所需项目的字典列表。此外,示例XML使用一个根标记和额外的</p>结束标记进行了修复:

代码语言:javascript
运行
复制
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'}]
票数 0
EN

Stack Overflow用户

发布于 2022-02-25 12:47:50

一个简单的备选方案:

代码语言:javascript
运行
复制
for car in XML_tree.xpath('//div[@n]'):
    print(car.xpath('@n')[0],car.xpath('normalize-space(.//p[@*[local-name()="xml:id"]]/text())'))

输出:

代码语言:javascript
运行
复制
0001 [car 1] Séquence préparatoire pour
0002 [blue] la voiture pour
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71259765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档