我有一个 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)
Run Code Online (Sandbox Code Playgroud)
这是代码片段,然后是正在读取的变量的不同变体
def getXpath(self)
xpath += 'starts-with(., \'' + self.text + '\') and '
xpath += ('count(@*)=' + str(attrsCount) if self.exactMatch else "1=1") + ']'
Run Code Online (Sandbox Code Playgroud)
self.text 基本上是标签的预期文本,在这种情况下:这是我的“测试”“字符串”
当我尝试使用 HTMLParser 对象的 xpath 方法时失败
tree.xpath(self.getXpath())
Run Code Online (Sandbox Code Playgroud)
原因是因为它得到的 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 \"
根据我们在维基百科和w3 school中看到的内容,节点内容中不应该有'and ",即使只有<and&被认为是严格非法的。它们应该被相应的“预定义实体引用”替换,即'和"。
顺便说一句,我使用的 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'
Run Code Online (Sandbox Code Playgroud)
所以我们可以看到Python正确地转义了东西。然后您可以复制粘贴您收到的错误消息(如果有)吗?