2

BeautifulSoup を使用していくつかの XML ドキュメント フィードを解析しています。前処理を行って、非標準CDATAタグをカスタム XML タグに置き換えたいと考えています。説明する:

次の XML ソース...

<title>The end of the world as we know it</title>
<category><![CDATA[Planking Dancing]]></category>
<pubDate><![CDATA[Sun, 16 Sep 2012 12:00:00 EDT]]></pubDate>
<dc:creator><![CDATA[Bart Simpson]]></dc:creator>

...次のようになります。

<title>The end of the world as we know it</title>
<category><myTag>Planking Dancing<myTag></category>
<pubDate><myTag>Sun, 16 Sep 2012 12:00:00 EDT<myTag></pubDate>
<dc:creator><myTag>Bart Simpson<myTag></dc:creator>

SOでこの質問が以前に尋ねられたとは思いません(いくつかの異なるSOクエリを試しました)。.findAll('cdata', text=True)また、 BeautifulSoupreplaceWith()メソッドを使用して結果のそれぞれに適用するいくつかの異なるアプローチも試しましたNavigableString。私が試みた結果、置換が行われないか、再帰ループのように見えます。

以前の試みを投稿できてうれしいですが、ここでの問題が非常に単純であることを考えると、BeautifulSoup 3を使用して上記の検索と置換を達成する方法の明確な例を誰かが投稿できることを願っています.

4

1 に答える 1

2

CDataは のサブクラスであるため、最初にすべてのオブジェクト を検索し、次にそれぞれが のインスタンスであるかどうかをテストすることで、すべての要素NavigableStringを見つけることができます。取得したら、あなたが提案したように、を使用して簡単に置き換えられます。CDataNavigableStringCDatareplaceWith

>>> from BeautifulSoup import BeautifulSoup, CData, Tag
>>> source = """
... <title>The end of the world as we know it</title>
... <category><![CDATA[Planking Dancing]]></category>
... <pubDate><![CDATA[Sun, 16 Sep 2012 12:00:00 EDT]]></pubDate>
... <dc:creator><![CDATA[Bart Simpson]]></dc:creator>
... """
>>> soup = BeautifulSoup(source)
>>> for navstr in soup(text=True):
...     if isinstance(navstr, CData):
...         tag = Tag(soup, "myTag")
...         tag.insert(0, navstr[:])
...         navstr.replaceWith(tag)
... 
>>> soup

<title>The end of the world as we know it</title>
<category><myTag>Planking Dancing</myTag></category>
<pubdate><myTag>Sun, 16 Sep 2012 12:00:00 EDT</myTag></pubdate>
<dc:creator><myTag>Bart Simpson</myTag></dc:creator>

>>>

いくつかのメモ:

  • オブジェクトを関数であるかのように呼び出すことができBeautifulSoup、その効果はその.findAll()メソッドを呼び出すのと同じです。

  • BS3 でオブジェクトのコンテンツを取得する唯一の方法はCData、上記のスニペットのようにスライスすることです。str(navstr)すべての <![CDATA[...]]>がらくたを保持しますが、これは明らかに望ましくありません。BS4ではstr(navstr) 、がらくたのないコンテンツを提供します。

于 2012-11-18T03:13:07.793 に答える