1

我正在使用 BeautifulSoup 4 (bs4) 来读取 XML RSS 提要,并且遇到了以下条目。我正在尝试阅读<content:encoded><![CDATA[...]]</content>标签中包含的内容:

<item>
    <title>Foobartitle</title>
    <link>http://www.acme.com/blah/blah.html</link>
    <category><![CDATA[mycategory]]></category>
    <description><![CDATA[The quick brown fox jumps over the lazy dog]]></description>
    <content:encoded>
        <![CDATA[<p><img class="feature" src="http://www.acme.com/images/image.jpg" alt="" /></p>]]>
    </content:encoded>
</item>

据我了解,这种格式是RSS 内容模块的一部分,非常常见。

我想隔离<content:encoded>标签,然后读取 CDATA 内容。为免生疑问,结果将是<p><img class="feature" src="http://www.acme.com/images/image.jpg" alt="" /></p>

我已经查看了thisthisthis stackoverflow 帖子,但我无法弄清楚如何完成这项工作,因为它们与我的案例没有直接关系。

我正在使用带有 bs4的lxml XML解析器。

有什么建议么?谢谢!

4

1 回答 1

3
from bs4 import BeautifulSoup

doc = ...
soup = BeautifulSoup(doc, "xml")  # Directs bs to use lxml

有趣的是,BeautifulSoup/lxml 改变了周围的标签,明显content:encoded地从 到 simple encoded

>>> print soup
<?xml version="1.0" encoding="utf-8"?>
<item>
<title>Foobartitle</title>
<link>http://www.acme.com/blah/blah.html</link>
<category>mycategory</category>
<description>The quick brown fox jumps over the lazy dog</description>
<encoded>
        &lt;p&gt;&lt;img class="feature" src="http://www.acme.com/images/image.jpg" alt="" /&gt;&lt;/p&gt;
    </encoded>
</item>

从那里,它应该只解析孩子。

for encoded_content in soup.findAll("encoded"):
    for child in encoded_content.children:
        print child

这导致<p><img class="feature" src="http://www.acme.com/images/image.jpg" alt="" /></p>. 请注意,这似乎是bs4.element.NavigableString链接答案中的 ,而不是 CData 的实例。

于 2013-07-03T01:46:51.150 回答