Динамическое формирование запроса на xpath, проблема с кавычками - PullRequest
0 голосов
/ 25 октября 2019

У меня возникают некоторые проблемы с lxml, которые не сохраняют исходный файл, например, если у меня есть xml-файл, содержащий:

  <column caption='Choix Découpage'   name='[Aujourd&apos;Hui Parameter (copy 2)]'>
            <alias key='&quot;Frais de Services&quot;' value='Offline Fees' />
  </column>

, и я взгляну на атрибут ключа узла псевдонима

from lxml import etree
import sys
tree = etree.parse('test.xml')
root = tree.getroot()
print([node.attrib['key'] for node in root.xpath("//alias")]) # we get ['"Billetterie Ferroviaire"']
value = [node.attrib['key'] for node in root.xpath("//alias")][0]

Теперь, если я хочу получить все псевдонимы узла с атрибутом «Billetterie Ferroviaire», я могу это сделать (решение приведено в другом посте, еще раз спасибо):

root.xpath("//alias[@key='\"Frais de Services\"']")

Но представьте, что я хочу динамически сформировать запрос:

"//alias[@key='\"Frais de Services\"']"

, но Python использует простые кавычки для строк, поэтому я не могу написать именно этот запрос. Может быть, xpath понимает другую эквивалентную форму? Я немного растерялся, если бы кто-нибудь мог объяснить мне, почему Python использует простую цитату и что я могу сделать, чтобы решить такие проблемы (всегда ли есть альтернативные способы, когда я хочу сгенерировать строку для другой программы, чтобы передать ее с хорошей структурой). Надеюсь быть достаточно ясным, чтобы помочь.

1 Ответ

0 голосов
/ 25 октября 2019

Просто избегайте тех апострофов, которые Python не должен интерпретировать как закрывающие строку:

 test = 'string which contains \'apostrophes\''

Переменная test будет содержать следующую строку:

string which contains 'apostrophes'

Я не уверен, как объяснить, почему Python использует апострофы для включения строк. Это просто решение, принятое дизайнерами языков. Строки могут быть заключены как в апострофы, так и в двойные кавычки, и обычно рекомендуется использовать те, которые не отображаются в прилагаемой строке (или их меньше), поэтому вам не нужно избегать их:

test = "string with 'apostrophes'"
test = 'string with "double quotes"'
test = 'string with both \'apostrophes\' and "double quotes"'
...