2011-12-28 7 views
5

Estoy tratando de analizar la figura a continuación código html usando lxml.html y usando en lugar de CSSSelectorXPath.Python: Selector de CSS para usar en el interior lxml.cssselect

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

el código de arriba me está dando content-1 y content-2 como salida pero mi salida deseada es link 1 link 2. Así que reemplacé mi código con

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

pero todavía obtengo el mismo resultado. Entonces mi pregunta es cuál es el selector de CSS adecuado para obtener el atributo 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> 

Respuesta

6

Yo creo no se puede obtener el valor del atributo a través de selectores CSS. Usted debe obtener los elementos ...

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

... y luego obtener los atributos de ellos:

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

Por supuesto, las listas por comprensión son sus amigos:

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

Desde no puede actualizar las propiedades de los atributos en CSS, creo que no tiene sentido conseguirlos a través de los selectores de CSS. Puede "mencionar" los atributos en los selectores de CSS para recuperarlos solo para que coincidan con sus elementos. Sin embargo, es solo una reflexión y puedo estar equivocado; si lo estoy, por favor, que alguien me corrija :) Bueno, @Tim Diggs confirma mi hipótesis a continuación :)

EDIT: Ahora puede hacerlo usando pseudo-selectores por ejemplo:

doc.cssselect('div.results dl dt a::attr('href')') 

Esto devolverá el atributo href de cada enlace.

+0

Acabo de descubrirlo por mi cuenta.De todas formas gracias por la respuesta – RanRag

+0

@brandizzi, tienes razón; solo puedes seleccionar elementos en css, no en atributos. Los paréntesis son para filtrar qué elementos seleccionar (pero no es una mala idea seleccionar solo etiquetas sin atributos href (que es lo que hace [href]). –

+0

@RanRag, debe marcar la respuesta de brandizzi como correcta incluso si no la necesita al final. –

3

Es necesario obtener el atributo en el resultado de cssselect (siempre devuelve el elemento, no un atributo):

primer lugar, no estoy seguro acerca de doc.cssselect (pero tal vez esto es su propia función ?)

lxml.cssselect se utiliza normalmente:

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

entonces, suponiendo que ya tienes un documento

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

o la más sucinta:

links = [a_href.get('href') for a_href in doc.cssselect('html body div.results dl dt a[href]')] 
+1

básicamente doc es equivalente a 'doc = lxml.html.fromstring (contenido)' donde el contenido son mis datos html de las funciones 'urllib y read' – RanRag

2

que han utilizado con éxito

#element-id ::attr(value) 

Para obtener el atributo "valor" para los elementos HTML.

0

lxml cssselector trabaja con la selección de atributos. A continuación, el código puede seleccionar el atributo src del elemento script 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 
Cuestiones relacionadas