2011-10-18 34 views
3

xpaths、xpathの属性とそのタグのテキストをアサートするために、xpathsをビルドしようとしているlxml etree HTMLParserオブジェクトがあります。私は、タグのテキストは、単一引用符( ')または二重引用符( ")のどちらかを持っている問題に走ったと私はすべてのオプションを使い果たしました。ここで 一重引用符と二重引用符を正しくエスケープする方法

は私が

parser = etree.HTMLParser() 
tree = etree.parse(StringIO(<html><body><p align="center">Here is my 'test' "string"</p></body></html>), parser) 
を作成したサンプル・オブジェクトのここ

は、コードのスニペットで、変数の後、さまざまなバリエーションが

def getXpath(self) 
    xpath += 'starts-with(., \'' + self.text + '\') and ' 
    xpath += ('count(@*)=' + str(attrsCount) if self.exactMatch else "1=1") + ']' 

self.text、この場合には、基本的にタグの予想されるテキストですで読まれている:ここでは私の「試験」「文字列」であり、

これは私がHTMLParserオブジェクトのXPathのメソッドを使用しようとすると、それを取得XPathはこの「/html/body/p[starts-with(.,'Hereは私であるため、

tree.xpath(self.getXpath()) 

理由がある失敗'test' "string" ')1 = 1]'

self.text変数から一重引用符と二重引用符を正しくエスケープするにはどうしたらいいですか?私はトリプルクォート、repr()でのself.textのラップ、またはre.subやstring.replaceを使って 'and'と\ 'and \ "をエスケープしようとしました。

答えて

0

我々はin Wikipediaw3 schoolを見ることができるものによると、あなただけの<&がstricly違法であると言われている場合でも、ノードの内容に'"を持つべきではありません。それらは、対応する「事前定義された実体参照」、すなわち&apos;および&quot;に置き換える必要があります。

ところで、私が使っているPythonパーサは、これを透過的に処理します:書き込むとき、置き換えられます。読んでいるとき、彼らは変換されます。

答えを2番目に読んだあと、私は'などのいくつかのものをPythonインタプリタでテストしました。それはあなたのためにすべてをエスケープします!

>>> 'text {0}'.format('blabla "some" bla') 
'text blabla "some" bla' 
>>> 'ntsnts {0}'.format("ontsi'tns") 
"ntsnts ontsi'tns" 
>>> 'ntsnts {0}'.format("ontsi'tn' \"ntsis") 
'ntsnts ontsi\'tn\' "ntsis' 

これで、Pythonが正しくエスケープすることが分かります。 (もしあれば)エラーメッセージをコピーして貼り付けることができますか?

+0

私はlxmlからエラーが発生しています:XPathEvalError:無効な式、スタックトレースが lxml.etree._ElementTree.xpath(src/lxml/tmp)の "lxml.etree.pyx" lxml.etree.c:45934) ファイル "xpath.pxi"、行379、lxml.etree.XPathDocumentEvaluator .__ call__(src/lxml/lxml.etree.c:114389) ファイル "xpath.pxi"、行242 、lxml.etree._XPathEvaluatorBase._handle_result(src/lxml/lxml.etree.c:113063) ファイル "xpath.pxi"、228行目、lxml.etree._XPathEvaluatorBase._raise_eval_error(src/lxml/lxml.etree。 c:112935) –

+0

mmh、式が無効であると言われるので、エラーは 'lxml'によって発生します。 'print'によってレンダリングされたときに' xpath'の値を貼り付けてください。 –

+0

'と'を対応するHTMLエンティティでエスケープしてしまったのですが、昨夜は本当に疲れていて、実際にはその文字列が解析されているとは考えていませんでした。このガイダンスをお寄せいただきありがとうございます –

0

さらに選択肢があります。 """'''があなたの望むものかもしれません。

s = "a string with a single ' quote" 
s = 'a string with a double " quote' 
s = """a string with a single ' and a double " quote""" 
s = '''another string with those " quotes '.''' 
s = r"raw strings let \ be \" 
s = r'''and can be added \ to " any ' of """ those things''' 
s = """The three-quote-forms 
     may contain 
     newlines.""" 
関連する問題