可能有一个解决我的问题的简单方法,但是我对python3还是很陌生,所以请对我轻松一点;)
我正在运行一个简单的脚本,该脚本已使用此代码成功解析了xml文件中的信息
import xml.etree.ElementTree as ET
root = ET.fromstring(my_xml_file)
u = root.find(".//name").text.rstrip()
print("Name: %s\n" % u)
我正在解析的xml如下
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/3.2/style/exchange.xsl"?>
<example:world-data xmlns="http://www.example.org" xmlns:ops="http://example.oorg" xmlns:xlink="http://www.w3.oorg/1999/xlink">
<exchange-documents>
<exchange-document system="acb.org" family-id="543672" country="US" doc-number="95962" kind="B2">
<bibliographic-data>
<name>SomeName</name>
...and so on... and ends like this
</exchange-document>
</exchange-documents>
</example:world-data>
(由于堆栈溢出策略,链接已被编辑)
预期输出
SomeName
但是,如果我尝试使用相同的python命令从相同的api解析另一个xml,则会收到此错误代码
AttributeError: 'NoneType' object has no attribute 'text'
第二个xml文件如下所示
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/3.2/style/pub-ftxt-claims.xsl"?>
<ops:world-data xmlns="http://www.example.org/exchange" xmlns:example="http://example.org" xmlns:xlink="http://www.example.org/1999/xlink">
<ftxt:fulltext-documents xmlns="http://www.examp.org/fulltext" xmlns:ftxt="ww.example/fulltext">
<ftxt:fulltext-document system="example.org" fulltext-format="text-only">
<bibliographic-data>
<publication-reference data-format="docdb">
<document-id>
<country>EP</country>
<doc-number>10000</doc-number>
<kind>A</kind>
</document-id>
</publication-reference>
</bibliographic-data>
<claims lang="EN">
<claim>
<claim-text>1. Some text.</claim-text>
<claim-text>2. Some text.</claim-text>
<claim-text>2. Some text.</claim-text>
</claim>
</claims>
</ftxt:fulltext-document>
</ftxt:fulltext-documents>
</ops:world-data>
我再次尝试
root = ET.fromstring(usr_str)
u = root.find(".//claim-text").text.rstrip()
print("Abstract: %s\n" % u)
预期产量
1. Some text.
但是它仅打印上述错误消息。 为什么我可以使用这些命令解析第一个xml而不解析第二个xml?
我们非常感谢您的帮助。
编辑:Jack Fleeting的代码可在python控制台中使用,但不幸的是,在我的PyCharm中无法使用
from lxml import etree
root = etree.XML(my_xml.encode('ascii'))
root2 = etree.XML(my_xml2.encode('ascii'))
root.xpath('//*[local-name()="name"]/text()')
root2.xpath('//*[local-name()="claim-text"]/text()')
这可能是我的PyCharm中的错误吗?我第一次提到的代码段仍会为名称打印正确的结果...
编辑:原来我不得不使用强制输出
a = root3.xpath('//*[local-name()="claim-text"]/text()')
print(a, flush=True)
答案 0 :(得分:0)
在我们寻求可能的解决方案之前,这里有两个问题。一个,您提供的第一个xml代码段无效(例如,<bibliographic-data>
未关闭)。我意识到这只是一个代码段,但是由于这是我们必须使用的代码,因此我修改了以下代码段以解决此问题。第二,两个代码片段都有xmlns声明,带有未绑定(未使用)前缀(第一个是example:world-data
,第二个是ops:world-data
)。我也必须删除这些前缀,以便其余的工作。
鉴于这些修改,使用lxml库应该对您有用。
第一个修改后的代码段:
my_xml = """<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/3.2/style/exchange.xsl"?>
<world-data xmlns="http://www.example.org" xmlns:ops="http://example.oorg" xmlns:xlink="http://www.w3.oorg/1999/xlink">
<exchange-documents>
<exchange-document system="acb.org" family-id="543672" country="US" doc-number="95962" kind="B2">
<bibliographic-data>
<name>SomeName</name>
...and so on... and ends like this
</bibliographic-data>
</exchange-document>
</exchange-documents>
</world-data>"""
并且:
my_xml2 = """<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/3.2/style/pub-ftxt-claims.xsl"?>
<world-data xmlns="http://www.example.org/exchange" xmlns:example="http://example.org" xmlns:xlink="http://www.example.org/1999/xlink">
<ftxt:fulltext-documents xmlns="http://www.examp.org/fulltext" xmlns:ftxt="ww.example/fulltext">
<ftxt:fulltext-document system="example.org" fulltext-format="text-only">
<bibliographic-data>
<publication-reference data-format="docdb">
<document-id>
<country>EP</country>
<doc-number>10000</doc-number>
<kind>A</kind>
</document-id>
</publication-reference>
</bibliographic-data>
<claims lang="EN">
<claim>
<claim-text>1. Some text.</claim-text>
<claim-text>2. Some text.</claim-text>
<claim-text>3. Some text.</claim-text>
</claim>
</claims>
</ftxt:fulltext-document>
</ftxt:fulltext-documents>
</world-data>"""
现在可以工作了:
from lxml import etree
root = etree.XML(my_xml.encode('ascii'))
root2 = etree.XML(my_xml2.encode('ascii'))
root.xpath('//*[local-name()="name"]/text()')
输出:
['SomeName']
root2.xpath('//*[local-name()="claim-text"]/text()')
输出:
['1。一些文字。','2。一些文字。”,“ 3。一些文字。']