【发布时间】:2021-05-25 09:34:27
【问题描述】:
我正在使用 xpath 来解析一个 xml 文件
from lxml import etree
example='''<div n="0001" type="car" xml:id="_3a327f0002">
<p xml:id="_3a327f0003">
1. A car is
<p xml:id="_3a327f0004"> - big, yellow and red;</p>
<p xml:id="_3a327f0005"> - has a big motor;</p>
<p xml:id="_3a327f0006"> - and also has <lb/>
big seats.
</p>
</p>
</div>'''
我想用下面的方式序列化上面的XML文件:
{"_3a327f0003": "1. A car is",
"_3a327f0004":"- big, yellow and red;"
"_3a327f0005":"- has a big motor;"
"_3a327f0006":"- and also has big seats"
基本上提取文本并构建一个字典,其中每个文本都属于他的xml:id。我的代码如下:
parser = etree.XMLParser(resolve_entities=False, strip_cdata=False, recover=True, ns_clean=True)
XML_tree = etree.fromstring(example.encode() , parser=parser)
all_paras = XML_tree.xpath('.//p[@xml:id]')
list_of_paragraphs = []
for para in all_paras:
mydict = {}
mydict['text'] = para.text
for att in para.attrib:
mykey=att
if 'id' in mykey:
mykey='xmlid'
mydict[mykey] = para.attrib[att]
list_of_paragraphs.append(mydict)
PDM_XML_serializer(example)
它的工作原理是,如果我有一个像这样的节点:
<p xml:id="_3a327f0006"> - and also has <lb/>
big seats.
</p>
它不会从
中提取部分我应该如何修改:
XML_tree.xpath('.//p[@xml:id]')
为了从
获取所有文本?
编辑: 可以使用 para.itertext() 但第一个节点也会返回其他节点的所有文本。
【问题讨论】:
-
尝试使用
para.text_content()而不是para.text -
AttributeError: 'lxml.etree._Element' 对象没有属性 'text_content'
-
你试过text_content吗?
-
是的......但没有运气:-(
-
实际上在执行 print(dir(para)) 时,我得到了不包括 text_content 的方法列表