Как выполнить поиск Python XPath без учета регистра с помощью lxml?

Я пытаюсь сопоставить страну или страну, используя нижний регистр] в 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()')
5
задан ThinkCode 28 June 2012 в 15:38
поделиться