Я пытаюсь сопоставить страну или страну, используя нижний регистр
] в XPath. translate
довольно запутанный, поэтому использование строчных букв, а моя версия Python 2.6.6 имеет поддержку XPath 2.0, я полагаю, поскольку строчные буквы доступны только в XPath 2.0.
Как я могу использовать строчные буквы в моем случае, это то, что я ищу. Надеюсь, пример понятен. Я ищу ['USA', 'US']
в качестве вывода (обе страны за один раз, что может произойти, если нижний регистр оценивает страну и страну как одно и то же).
HTML: doc.htm
<html>
<table>
<tr>
<td>
Name of the Country : <span> USA </span>
</td>
</tr>
<tr>
<td>
Name of the country : <span> UK </span>
</td>
</tr>
</table>
Python:
import lxml.html as lh
doc = open('doc.htm', 'r')
out = lh.parse(doc)
doc.close()
print out.xpath('//table/tr/td[text()[contains(. , "Country")]]/span/text()')
# Prints : [' USA ']
print out.xpath('//table/tr/td[text()[contains(. , "country")]]/span/text()')
# Prints : [' UK ']
print out.xpath('//table/tr/td[lower-case(text())[contains(. , "country")]]/span/text()')
# Prints : [<Element td at 0x15db2710>]
Обновление:
out.xpath('//table/tr/td[text()[contains(translate(., "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz") , "country")]]/span/text()')
Теперь остается вопрос: могу ли я сохранить часть перевода как глобальную переменную 'handlecase' и печатать эту глобальную переменную всякий раз, когда я выполняю XPath?
Что-то вроде этого работает:
handlecase = """translate(., "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz")"""
out.xpath('//table/tr/td[text()[contains(%s , "country")]]/span/text()' % (handlecase))
Но ради простоты и удобочитаемости я хочу запустить это так:
out.xpath('//table/tr/td[text()[contains(handlecase , "country")]]/span/text()')