如何正确地逃避单引号和双引号

时间:2011-10-18 04:28:43

标签: python lxml

我有一个lxml etree HTMLParser对象,我正在尝试构建xpath以断言xpath,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基本上是标签的预期文本,在这种情况下:这是我的'test'“string”

当我尝试使用HTMLParser对象的xpath方法

时,这会失败
tree.xpath(self.getXpath())

原因是因为它获得的xpath是'/html/body/p[starts-with(.,'Here是我的'测试'“字符串”')和1 = 1]'

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

3 个答案:

答案 0 :(得分: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."""

答案 1 :(得分:0)

根据我们可以看到in Wikipediaw3 school的内容,您不应在节点内容中包含'",即使只有<和{据说{1}}严重违法。它们应该被相应的“预定义实体引用”替换,即&&apos;

顺便说一句,我使用的Python解析器将透明地处理这个问题:写入时,它们会被替换;在阅读时,它们会被转换。

在您第二次阅读答案之后,我在Python解释器中使用&quot;等测试了一些内容。它会为你逃避一切!

'

所以我们可以看到Python正确地逃避了事情。你可以复制粘贴你得到的错误信息(如果有的话)吗?

答案 2 :(得分:0)

如果您使用python lxml,则该解决方案适用。 最好将转义符留给lxml。我们可以使用lxml变量来做到这一点。 假设我们有xpath如下:

//tagname[text='some_text']`

如果some_text同时具有单引号和双引号,则它将引起"Invalid Predicate error"。 无论是为我逃避工作还是三引号。因为xml不接受三引号。

对我有用的解决方案是lxml变量。

我们如下转换xpath:

//tagname[text = $var]

然后执行

find = etree.XPath(xpath)

然后将这些变量评估为其值

elements = find(root, {'var': text})