我不知道';找不到处理的方法<;内容:编码>;从lxml库中使用python和etree标记
我正在向rss提供商处理xml文件。我在尝试处理复合标记时发现了一个问题,如下面代码中所示,我不知道';找不到处理的方法<;内容:编码>;从lxml库中使用python和etree标记,python,xml,rss,lxml,elementtree,Python,Xml,Rss,Lxml,Elementtree,我正在向rss提供商处理xml文件。我在尝试处理复合标记时发现了一个问题,如下面代码中所示,和 嗯,我在网上搜索了一个解决方案,我找到了一个解决方案。在文档的头部会出现一个带有rss文件信息的标记,以及一个标记。在这个标记中,我看到了属性xmlns:dc=”http://purl.org/dc/elements/1.1/“,因此,我使用它来查找creator标记中的文本,有些类似于: import xml.etree.ElementTree as ET xml = '''<?xml ve
和
嗯,我在网上搜索了一个解决方案,我找到了一个解决方案。在文档的头部会出现一个带有rss文件信息的标记,以及一个标记。在这个标记中,我看到了属性xmlns:dc=”http://purl.org/dc/elements/1.1/“
,因此,我使用它来查找creator标记中的文本,有些类似于:
import xml.etree.ElementTree as ET
xml = '''<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<item>
<title><![CDATA[Yo, Juan Carlos]]></title>
<dc:creator><![CDATA[Javier Ayuso]]></dc:creator>
<content:encoded><![CDATA[<p>Los peores momentos de mi reinado.</p>]]></content:encoded>
</item>
</channel>
</rss>'''
root = ET.fromstring(xml)
# the namespaces contained in this document
ns = {'dc': 'http://purl.org/dc/elements/1.1/',
'content': 'http://purl.org/rss/1.0/modules/content/'}
node = root.find('channel/item')
print(node.find('dc:creator', ns).text) # N.B. pass namespaces to find()
print(node.find('content:encoded', ns).text)
# These also work...
print(node.find('{http://purl.org/dc/elements/1.1/}creator').text)
print(node.find('{http://purl.org/rss/1.0/modules/content/}encoded').text)
发件人:
creator=node.find('dc:creator')。text#不起作用。
到
creator=node.find('{http://purl.org/dc/elements/1.1/}创建者“)。文本#工作代码>
嗯,到目前为止还不错,但是当我尝试对标签
执行相同的操作时,这不起作用,我不明白为什么。
rss标记中有一个属性:xmlns:content=”http://purl.org/rss/1.0/modules/content/“
但如果我也这样做,这是行不通的
我确信该对象已完全加载,但我不明白为什么“text”方法与另一种情况不同
content=node.find('{http://purl.org/rss/1.0/modules/content/}编码)。文本
我看到的错误是:
File "eTree.py", line 30, in parseXML
content = node.find('{http://purl.org/rss/1.0/modules/content/}encoded').text
AttributeError: 'NoneType' object has no attribute 'text'
有什么想法吗
xml文档的最低版本为:
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<item>
<title><![CDATA[Yo, Juan Carlos]]></title>
<dc:creator><![CDATA[Javier Ayuso]]></dc:creator>
<content:encoded><![CDATA[<p>Los peores momentos de mi reinado.</p>]]></content:encoded>
</item>
</channel>
</rss>
米雷纳多大教堂。]>
如中所述,您可以尝试将命名空间字典传递给find()
/findall()
/iterfind()
,这将使您能够使用命名空间作为元素名称的前缀,如下所示:
import xml.etree.ElementTree as ET
xml = '''<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<item>
<title><![CDATA[Yo, Juan Carlos]]></title>
<dc:creator><![CDATA[Javier Ayuso]]></dc:creator>
<content:encoded><![CDATA[<p>Los peores momentos de mi reinado.</p>]]></content:encoded>
</item>
</channel>
</rss>'''
root = ET.fromstring(xml)
# the namespaces contained in this document
ns = {'dc': 'http://purl.org/dc/elements/1.1/',
'content': 'http://purl.org/rss/1.0/modules/content/'}
node = root.find('channel/item')
print(node.find('dc:creator', ns).text) # N.B. pass namespaces to find()
print(node.find('content:encoded', ns).text)
# These also work...
print(node.find('{http://purl.org/dc/elements/1.1/}creator').text)
print(node.find('{http://purl.org/rss/1.0/modules/content/}encoded').text)
将xml.etree.ElementTree作为ET导入
xml=“”
米雷纳多大教堂。]>
'''
root=ET.fromstring(xml)
#此文档中包含的名称空间
ns={'dc':'http://purl.org/dc/elements/1.1/',
'内容':'http://purl.org/rss/1.0/modules/content/'}
node=root.find('channel/item')
print(node.find('dc:creator',ns.text)#N.B.将名称空间传递给find()
打印(node.find('content:encoded',ns).text)
#这些也很有效。。。
打印(node.find(){http://purl.org/dc/elements/1.1/}(文本)
打印(node.find(){http://purl.org/rss/1.0/modules/content/}编码文本)
输出
Javier Ayuso
<p>Los peores momentos de mi reinado.</p>
Javier Ayuso
<p>Los peores momentos de mi reinado.</p>
Javier Ayuso
米雷纳多大教堂
哈维尔·阿尤索
米雷纳多大教堂
最后,问题不在处理过程中,我工作得很好。我最大的失败是没有正确检查文件。在这里的问题中,我只编写了整个.xml的一小部分,但它是一个庞大的文件,我刚刚发现一些项
中没有标记
,因此find方法不会返回带有“text”属性的对象。我的处理方式和使用名称空间的方式都是正确的。
现在,我更改了代码,在输入“text”属性之前检查对象是否存在,这非常有效
if node.find('content:encoded',ns) is not None:
contenido = node.find('content:encoded',ns).text
非常感谢您提供的所有答案。发布简化的XML,我们可以使用它来重现问题。否则,人们只能猜测是的,当然。谢谢。无法重现问题,这是用于测试的完整工作代码:谢谢你的回答,最后问题不是处理的方式,只是对象的存在。对。因此,将名称空间字典传递给find()
与此无关??除了检查None
之外,这就是您在答案中添加的内容。