Python: CSS-селектор для использования внутри lxml.cssselect - PullRequest
7 голосов
/ 28 декабря 2011

Я пытаюсь проанализировать приведенный ниже HTML-код, используя lxml.html и используя CSSSelector вместо XPath.

link = doc.cssselect('html body div.results dl dt a)

код выше дает мне content-1 и content-2 в качестве вывода, но мой желаемый вывод - link 1 link 2.Поэтому я заменил свой код на

link = doc.cssselect('html body div.results dl dt a[href]')

, но все равно получаю тот же вывод.Поэтому мой вопрос в том, какой правильный CSS-селектор для получения атрибута href.

             <div class = "results">
                     <div> some tags here </div>
                        <dl> 
                              <dt title = "My Title 1" style = "background: transparent url('/img/accept.png') no-repeat right center">
                              <a href = "/link 1"> content-1</a> 
                              </dt>
                       </dl>

                      <dl>
                             <dt title = "My Title 2" style = "background: transparent url('/img/accept.png') no-repeat right center">
                             <a href = "/link 2">content-2</a>
                             </dt>
                     </dl>
            </div>

Ответы [ 4 ]

8 голосов
/ 28 декабря 2011

I считаю , вы не можете получить значение атрибута с помощью селекторов CSS. Вы должны получить элементы ...

>>> elements = doc.cssselect('div.results dl dt a')

... а затем получить от них атрибуты:

>>> for element in elements:
...     print element.get('href')
... 
/link 1
/link 2

Конечно, список пониманий ваших друзей:

>>> [element.get('href') for element in elements]
['/link 1', '/link 2']

Поскольку вы не можете обновлять свойства атрибутов в CSS, я считаю, что нет смысла получать их с помощью селекторов CSS. Вы можете «упоминать» атрибуты в селекторах CSS, чтобы получать их только в соответствии с их элементами. Однако, это просто размышление, и я могу ошибаться; если я, пожалуйста, кто-нибудь поправит меня:) Ну, @Tim Diggs подтверждает мою гипотезу ниже:)

3 голосов
/ 28 декабря 2011

Вам нужно получить атрибут в результате cssselect (он всегда возвращает элемент, а не атрибут):

во-первых, я не уверен насчет doc.cssselect (но, возможно, это ваше собственноеfunction?)

lxml.cssselect обычно используется:

from lxml.cssselect import CSSSelector
sel = CSSSelector('html body div.results dl dt a[href]')

тогда, если вы уже получили документ

links = []
for a_href in sel(doc):
    links.append(a_href.get('href'))

или более краткий:

links = [a_href.get('href') for a_href in doc.cssselect('html body div.results dl dt a[href]')]
2 голосов
/ 20 января 2014

Я успешно использовал

#element-id ::attr(value)

Чтобы получить атрибут "value" для элементов HTML.

0 голосов
/ 17 апреля 2015

lxml cssselector работает с выбором атрибутов. Ниже код может выбрать атрибут src из элемента HTML-скрипта.

   select = cssselect.CSSSelector("script[src]")
   links = [ el.get('src') for el in select(dochtml) ]
   links=iter(links)
   for n, l in enumerate(links):
       print n, l
...