2011-12-10 9 views
7

私はXPathを初めて使いました。私はXPathを使用してページを解析しようとしています。私はタグから情報を得る必要がありますが、タイトルスクリューでアポストロフィを逃れてすべてを上げました。アポストロフィ付きのPython XPath解析タグ

解析するにはGrabを使用してください。ソースから

タグ:

<img src='somelink' border='0' alt='commission:Alfred\'s misadventures' title='commission:Alfred\'s misadventures'> 

実際のXPath:

g.xpath('.//tr/td/a[3]/img').get('title') 

戻り

commission:Alfred\\ 

この問題を解決する方法はありますか?

ありがとうございます。

+4

正直なところ、あなたの '.xpath'が何かを返すのはうれしいことです。このHTMLは、LXMLの 'html'モジュールがそれを抑制するには十分ではありません。 –

+2

私はちょうどlxmlとBeautifulSoupを試してみましたが、どちらも正しく解析していませんでした。明らかに、属性値の外側の引用符は二重引用符でなければなりません。 htmlのソースは何ですか? – ekhumoro

答えて

5

ゴミが入っています。あなたの入力は、一重引用符文字を間違ってエスケープするため、整形式ではありません。多くのプログラミング言語(Pythonを含む)は、バックスラッシュ文字を使用して文字列リテラルの引用符をエスケープします。 XMLはそうではありません。 1)属性の値を二重引用符で囲むか、または2)&apos;を使用すると、一重引用符が含まれます。 the XML specから

は、属性値は、単一引用符と二重引用符、 アポストロフィまたは単一引用符( ') 『 &apos;』として表されてもよいし、二重引用符の両方を含むことができるように&quot;「などの文字()」」。

+0

情報をありがとう、それは私の入力ではありません。私はそのタグを持つページを解析しようとしているので、これを修正する唯一の方法です - ソース全体を置き換えてください。喜んで、私はすでに解決しています(正確ではありませんが、とにかく...)regex –

+1

XMLのこの問題はPostelの法則を破りますが、実際には入力をマッサージしてから適切なXMLパーサに送信する必要があることがあります。いくつかの純粋主義者はあなたのためにそれを嫌うでしょうが、私はそれについてあまり気にしません。 –

+0

XMLでは、属性値にアポストロフィを取得する方法が既に2通りあります。(1)アポストロフィ(2)の代わりに引用符で囲みます。 ''' Postelに準拠させ、2つの追加メソッドを追加しましょう。 (1)SQLのように、バックスラッシュエスケープ(2)アポストロフィダブリング。あなたの仕事:文法を更新し、パーサーを強化する。代替方法:XMLが、HTMLを受け入れるために消費者が邪魔にならないようなHTMLの混乱を避けることができればうれしい。 –

1

提供されるように、 『XML』は、ネストされたため、アポストロフィに整形式文書ではない、何のXPath式は、それに基づいて評価することはできない 。設けられた非整形式のテキストはに補正することができ

:引用符を使用しない奇妙なrequiremendがある場合は

<img src="somelink" 
border="0" 
alt="commission:Alfred's misadventures" 
title="commission:Alfred's misadventures"/> 

、そして1正しいconvertionはです:

<img src='somelink' 
border='0' 
alt='commission:Alfred&apos;s misadventures' 
title='commission:Alfred&apos;s misadventures'/> 

誤った入力がC#などの言語で提供された場合、

を使用して正しい相手に変換しようとする可能性があります
string correctXml = input.replace("\\'s", "&apos;s") 

おそらく、Pythonでも同じようにすることができます。