我没有找到从 lxml 库使用 python 和 etree 处理<内容:编码>标签的方法



我正在处理xml文件到rss提供程序。当我尝试处理复合标记时,我发现了一个问题,就像我在下面的代码中显示的那样,<dc:creator>, and <content:encoded>

嗯,我在网上搜索了一个解决方案,我找到了一个解决方案。在文档的头部出现一个带有rss文件信息的标签,带有一个标签。在这个标签中,我看到了属性xmlns:dc="http://purl.org/dc/elements/1.1/",所以,我用它来查找创建者标签中的文本,有些像这样:

来自:

creator = node.find('dc:creator').text #Doesn't work.

creator = node.find('{http://purl.org/dc/elements/1.1/}creator').text #Work !

嗯,到目前为止还好,但是当我尝试用标签<content:encoded>做同样的事情时,这不起作用,我不明白为什么。在rss标签中有一个属性:xmlns:content="http://purl.org/rss/1.0/modules/content/",但如果我做同样的事情,这不起作用。

我确信对象被完美加载,但我不明白为什么没有"text"方法像在其他情况下。

content = node.find('{http://purl.org/rss/1.0/modules/content/}encoded').text

我看到的错误是:

 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>

如使用名称空间解析XML中所述,您可以尝试将名称空间的字典传递给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)

Javier Ayuso
<p>Los peores momentos de mi reinado.</p>
Javier Ayuso
<p>Los peores momentos de mi reinado.</p>

最后问题不在处理上,我工作得很好。我最大的失败是没有正确检查文件。在这里的问题中,我只写了整个.xml的一小部分,但这是一个巨大的文件,我刚刚发现<item></item>中的几个项目没有标记<content:encoded>,因此find方法不返回具有"文本"属性的对象。我的处理方法和使用名称空间的方法都是正确的。现在我更改了代码,在输入"text"属性之前检查对象是否存在,这工作得很好。

    if node.find('content:encoded',ns) is not None:
        contenido = node.find('content:encoded',ns).text

非常感谢你的回答。

最新更新