Как правильно избегать одинарных и двойных кавычек - PullRequest
3 голосов
/ 18 октября 2011

У меня есть объект HTMLParser lxml etree, с помощью которого я пытаюсь создать 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 - это, в основном, ожидаемый текст тега, в данном случае: вот моя «тестовая» «строка»

это не работает, когда я пытаюсь использовать метод xpath объекта HTMLParser

tree.xpath(self.getXpath())

Причина в том, что получаемый xpath заключается в следующем '/html/body/p[starts-with(.,' Здесь моя "тестовая" "строка" ') и 1 = 1]'

Как правильно экранировать одинарные и двойные кавычки из переменной self.text? Я пробовал тройные кавычки, оборачивая self.text в repr (), или делая re.sub или string.replace, экранируя 'и' with \ 'and \ "

Ответы [ 2 ]

0 голосов
/ 18 октября 2011

Согласно тому, что мы видим в Википедии и w3 school , у вас не должно быть ' и " в содержимом узлов, даже если только < и *Говорят, что 1008 * строго незаконно.Они должны быть заменены соответствующими «предопределенными ссылками на сущности», которые являются &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 голосов
/ 18 октября 2011

есть еще варианты, особенно """ и ''' могут быть тем, что вы хотите.

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