我找不到使用 python 和 lxml 库中的 etree 处理 <content:encoded> 标签的方法

I don't find way to process <content:encoded> tag with python and etree from lxml library

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

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

发件人:

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>

Parsing XML with Namespaces 中所述,您可以尝试将命名空间的字典传递给 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 方法不是 return 具有 "text" 属性的对象。我的处理方式和使用命名空间的方式都是正确的。 现在我更改了代码,在输入 "text" 属性之前检查对象是否存在,这非常有效。

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

非常感谢您的所有回答。