2011-12-28 8 views
5

lxml.htmlを使用し、XPathの代わりにCSSSelectorを使用して、下記のhtmlコードを解析しようとしています。Python:lxml.cssselectの中で使用するCSSセレクタ

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

上記のコードは、出力として私content-1content-2を与えているが、私の所望の出力はlink 1 link 2です。だから、コードを

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

と置き換えましたが、まだ同じ出力が得られています。だから私の質問は、href属性を取得する適切なCSSセレクターです。

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

答えて

6

私は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は:)

EDITの下に私の仮説を確認:あなたは今擬似セレクターなどを使ってこれを行うことができます。

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

これが返されます各リンクのhref属性

+0

私はそれを自分で考え出しました。とにかく答えが – RanRag

+0

@brandizziの場合は、あなたが正しいです - あなたはCSSでは、属性ではなく要素を選択することができます - 括弧はどの要素を選択するかをフィルタリングします(ただし、href属性なしのタグどのようなa [href]があるか)。 –

+0

@RanRag、最後にそれが必要ない場合でも、brandizziの答えを正確にチェックしてください。 –

3

あなたが(それは常に要素、決して属性を返す)cssselectの結果に属性を取得する必要があります。

まず、私はdoc.cssselectについてはよく分からない(多分これは、独自の機能です?)

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]')] 
+1

基本的にdocは 'doc = lxml.html.fromstring(content)'と同じです。ここでcontentは 'urllibとread'関数からのHTMLデータです – RanRag

2

私は、HTML要素のための "値" 属性を取得するには

#element-id ::attr(value) 

を成功裏に使用しています。

0

lxml cssselectorは属性の選択で機能します。以下のコードでは、HTMLスクリプト要素からsrc属性を選択できます。

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