2011-12-28 21 views
5

lxml.html kullanarak XPath yerine CSSSelector kullanarak aşağıda verilen html kodunu ayrıştırmaya çalışıyorum.Python: İçinde kullanmak için CSS Seçici lxml.cssselect içinde

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

Yukarıdaki kod çıkışı olarak bana content-1 ve content-2 veriyor ama benim istenen çıkış link 1 link 2 olduğunu. Bu yüzden kodumu

ile değiştirdim, ancak yine de aynı çıktıyı alıyorum. Yani benim sorum href özniteliği almak için uygun CSS seçicisidir.

   <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> 

cevap

6

Ben CSS seçicileri aracılığıyla özellik değerini alamayan inanmak . Onlardan özelliklerini almak sonra ...

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

öğelerini almak ... ve olmalıdır:

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

beri: Elbette

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

, liste comprehensions Arkadaşlarınızın CSS'deki özniteliklerin özelliklerini güncelleyemezsiniz, CSS seçiciler aracılığıyla bunları elde etmenin bir anlamı olmadığını düşünüyorum. CSS seçicilerindeki öznitelikleri yalnızca öğelerini eşleştirmek için almak için "bahsi geçebilirsiniz". Ancak, sadece bir araya gelmek ve yanlış olabilir; Ben isem, birisi bana lütfen düzeltin :) Eh, @Tim Diggs :)

DÜZENLEME altında hipotezimi doğruluyor:

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

Bu dönecektir: Artık sözde seçicileri örn kullanarak yapabilirsiniz her bağlantının href niteliği.

Sen cssselect sonucuna niteliğini almak gerekir
+0

Sadece kendim anladım.Her neyse cevabınız için teşekkürler – RanRag

+0

@brandizzi, haklısınız - sadece css içindeki öğeleri seçemezsiniz, öznitelikleri değil - köşeli parantezler hangi elemanların seçileceğini filtrelemek içindir (ama sadece etiketlerini href öznitelikleri olmadan seçmek için değil –

+0

@RanRag, sonuna kadar ihtiyacınız olmasa bile brandizzi'nin cevabını doğru olarak işaretlemelisiniz. –

3

(her zaman elemanı, asla bir özellik verir): Ben doc.cssselect hakkında emin değilim, öncelikle

(ama belki bu kendi fonksiyonudur ?)

lxml.cssselect normalde kullanılır:

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

sonra, zaten bir doktorum var varsayarak

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

veya daha fazla özlü:

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

temelde doc 'doc = lxml.html.fromstring (içerik)' içeriğine eşdeğerdir 'içerik urllib ve read' işlevlerinden benim html veri – RanRag

2

başarıyla HTML öğeleri için "değer" özelliğini elde etmek için

#element-id ::attr(value) 

kullandık.

0

lxml cssselector, öznitelikler seçimiyle çalışır. Kodun altında HTML komut elemanından src özniteliği seçilebilir.

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 
İlgili konular