我找不到使用 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
非常感谢您的所有回答。
我正在处理 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
非常感谢您的所有回答。