繁体   English   中英

如何正确转义单引号和双引号

[英]How to properly escape single and double quotes

我有一个 lxml etree HTMLParser 对象,我试图用它来构建 xpaths 来断言 xpaths、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 is my 'test' "string"') and 1=1]'

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

有更多选项可供选择,尤其是"""'''可能是您想要的。

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."""

根据我们在 Wikipediaw3 school 中看到的,您不应该在节点内容中包含'" ,即使只有<&被认为是严格非法的。它们应该替换为相应的“预定义实体引用”,即&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 正确地转义了东西。 然后你能复制粘贴你得到的错误信息(如果有的话)吗?

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

//tagname[text='some_text']`

如果some_text具有单引号和双引号,则会导致"Invalid Predicate error" 对我来说既不是逃避工作,也不是三重引号。 因为 xml 不接受三重引号。

对我lxml解决方案是lxml变量。

我们将xpath转换如下:

//tagname[text = $var]

然后执行

find = etree.XPath(xpath)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM