如何正确转义单引号和双引号
问题内容:
我有一个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基本上是标记的预期文本,在这种情况下:这是我的“测试”“字符串”
当我尝试使用HTMLParser对象的xpath方法时,这将失败
tree.xpath(self.getXpath())
原因是因为它获取的xpath是这个’/html/body/p[starts-with(.,’Here is my’test’“ string”’)and 1
= 1]’
如何正确地将self.text变量中的单引号和双引号转义?我试过三重引号,将self.text包裹在repr()中,或做一个re.sub或string.replace来将’和’换成\和’
问题答案:
据我们可以看到在维基百科和W3学校,你不应该有'
,并"
在节点的内容,即使只<
和&
被说成是非法stricly。应将其替换为相应的“预定义实体引用”'
和"
。
顺便说一下,我使用的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正确地进行了转义。然后可以复制粘贴收到的错误消息(如果有)吗?