Использование cxselect в lxml.html для выбора элемента с двоеточием в атрибуте ID - PullRequest
3 голосов
/ 13 декабря 2011

У меня есть элемент на странице, который выглядит следующим образом:

<a id="cid-694094:Comment:188384" name="694094:Comment:188384"></a>

Если вы сделаете document.cssselect("#cid-694094:Comment:188384"), вы получите:

lxml.cssselect.ExpressionError:Символ псевдо-класса (u'Comment ', 12) неизвестен

Решение для этого решено в этом вопросе (человек использовал Java).

Тем не менее, когда я пытаюсь сделать это в Python следующим образом:

document.cssselect(r"#cid-694094\:Comment\:188384")

, я получаю:

lxml.cssselect.SelectorSyntaxError: Неверный символ 'cid-694094 \': 'Кодек unicodeescape 'не может декодировать байт 0x5c в позиции 10: \ в конце строки в [Token (u' # ', 0)] -> Нет

Причина этого и предлагаемое решениеможно найти в этот вопрос .Если я правильно понимаю, я должен делать:

document.cssselect(r"#cid-694094\\:Comment\\:188384")

Но это все равно не работает.Вместо этого я снова получаю:

lxml.cssselect.ExpressionError: Символ класса psuedo (u'Comment \ ', 14) неизвестен

Может кто-нибудь сказать мнечто я делаю не так?

Попробуйте сами, используя:

import lxml.html
document = lxml.html.fromstring(
    '<a id="cid-694094:Comment:188384" name="694094:Comment:188384"></a>'
)
document.cssselect(r"#cid-694094\:Comment\:188384")

Ответы [ 2 ]

4 голосов
/ 13 декабря 2011

Разве : не разрешено в css для идентификатора или класса?

Вот обходной путь:

document.xpath('//a[@id="cid-694094:Comment:188384"]')
1 голос
/ 17 июня 2012

: обычно не допускается в селекторах идентификаторов, и это действительно правильный способ избежать этого:

document.cssselect(r"#cid-694094\:Comment\:188384")

Однако синтаксический анализатор селекторов в действительности до недавнего времени не работал.(На самом деле он не реализовал обратную косую черту.) Я исправил это в cssselect 0.7, который теперь является независимым проектом, извлеченным из lxml.

http://packages.python.org/cssselect/

«Новый» способ использованияэто немного более многословно:

import cssselect
document.xpath(cssselect.HTMLTranslator().css_to_xpath('#cid-694094\:Comment\:188384'))

lxml 2.4 (еще не выпущен) будет использовать новый cssselect, поэтому будет работать и более простой синтаксис.

...