我不知道';找不到处理的方法<;内容:编码>;从lxml库中使用python和etree标记

我不知道';找不到处理的方法<;内容:编码>;从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提供商处理xml文件。我在尝试处理复合标记时发现了一个问题,如下面代码中所示,

嗯,我在网上搜索了一个解决方案,我找到了一个解决方案。在文档的头部会出现一个带有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
之外,这就是您在答案中添加的内容。