Я пытаюсь сопоставить страну или страну, используя функцию lower-case
в 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>
Питон:
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()')
lxml supports XPath 1.0
; таким образом, с lxml вы застряли с переводом. - person Martijn Pieters   schedule 27.06.2012lower-case()
: lxml.etree.XPathEvalError: незарегистрированная функция. Код после того, как я фактически заставил перевод работать, выполнив..., не может быть правильным. - person mzjn   schedule 27.06.2012