2011-10-18 88 views
3

我有我试图建立与XPath的断言的XPath一个LXML etree的HTMLParser对象,属性是标签的XPath和文字。我跑进当标签的文本有两种单引号(')或双引号(“)问题,我已经用尽我的所有选项。如何正确逃生单引号和双引号

这里是我创建

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的方法失败

tree.xpath(self.getXpath()) 

原因是因为它得到了XPath是这个“/html/body/p[starts-with(.,'Here是我的'test'“string”')and 1 = 1]'

如何正确地从self.text变量中转义单引号和双引号?我尝试了三重引用,在repr()中包装self.text,或者做一个re.sub或string.replace转义'和'与\'和\“

回答

0

据我们可以看到in Wikipediaw3 school,你不应该有'"中的节点的内容,即使只有<&被说成是非法stricly。它们应该被替换为相应的“预定义实体引用”,即&apos;&quot;

顺便说一句,我用会照顾这个透明的Python的解析器:写作时,它们被替换;阅读时,它们会被转换。

经过第二次阅读您的答案后,我在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.pyx”,行2029,在lxml.etree._ElementTree.xpath(src/lxml/lxml.etree.c:45934) lxml.etree.XPathDocumentEvaluator .__ call__(src/lxml/lxml.etree.c:114389)中的文件“xpath.pxi”,第379行, 文件“xpath.pxi”,第242行,在lxml.etree._XPathEvaluatorBase._raise_eval_error(src/lxml/lxml.etree)中,文件“xpath.pxi”,第228行,在lxml.etree._XPathEvaluatorBase._handle_result(src/lxml/lxml.etree.c:113063) c:112935) –

+0

mmh,由'lxml'引发错误,因为表达式被认为是无效的。你可以粘贴“xpath”的值,当用'print'渲染时? –

+0

用他们相应的HTML实体转义'和“做了诀窍。昨晚我真的很累,并没有想到这个字符串实际上是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."""