2011-12-28 3 views
5

lxml.html을 사용하고 아래 코드를 XPath 대신 CSSSelector을 사용하여 아래 코드를 구문 분석하려고합니다.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') 

을 요소를 얻을 ... 그리고해야

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

가입일 : 물론

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

을, 지능형리스트는 당신의 친구입니다 CSS 속성의 속성을 업데이트 할 수 없기 때문에 CSS 선택기를 통해 속성을 가져 오는 것에 대해 아무런 의미가 없다고 생각합니다. CSS 선택기에서 속성을 "언급"하여 해당 요소와 일치하도록 검색 할 수 있습니다. 그러나, 단지 합동이고 나는 틀릴 수도 있습니다. 내가 경우, 누군가가 나 수정하시기 바랍니다 :) 음이, @ 팀 열심히 잖아요가 :

편집 아래에있는 내 가설을 확인 :

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

이것은을 반환합니다 : 이제 의사 선택기 등을 사용하여이 작업을 수행 할 수 있습니다 각 링크의 href 속성

당신은 cssselect의 결과에 대한 속성을 얻을 필요가
+0

나는 혼자 그것을 알아 냈다.어쨌든 대답을 주셔서 감사합니다 – RanRag

+0

@brandizzi, 당신 말이 맞아요 - 당신은 CSS가 아니라 속성을 선택할 수 있습니다 - 괄호는 어떤 요소를 필터링 할 수 있습니다 (하지만 나쁜 생각이 아니라면 href 속성없이 태그를 선택하십시오 어떤 [a href]가 무엇입니까?) –

+0

@RanRag, 결국 필요하지 않은 경우에도 brandizzi의 대답을 올바른 것으로 표시해야합니다. –

3

는 (항상 요소, 결코 속성 반환) : 나는 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