2011-12-28 28 views
5

Tôi đang cố gắng phân tích cú pháp mã html dưới đây bằng cách sử dụng lxml.html và sử dụng CSSSelector thay vì XPath.Python: Bộ chọn CSS để sử dụng bên trong lxml.cssselect

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

mã trên là đem lại cho tôi content-1content-2 như đầu ra nhưng đầu ra mong muốn của tôi là link 1 link 2. Vì vậy, tôi đã thay thế mã của mình bằng

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

nhưng vẫn nhận được cùng một đầu ra. Vì vậy, câu hỏi của tôi là bộ chọn CSS thích hợp để lấy thuộc tính href là gì.

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

Trả lời

6

I tin rằng bạn không thể nhận giá trị thuộc tính thông qua bộ chọn CSS. Bạn sẽ nhận được các yếu tố ...

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

... và sau đó nhận được các thuộc tính từ họ:

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

Tất nhiên, danh sách comprehensions là bạn bè:

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

Kể từ bạn không thể cập nhật các thuộc tính của các thuộc tính trong CSS, tôi tin rằng không có ý nghĩa gì về việc nhận chúng thông qua các bộ chọn CSS. Bạn có thể "đề cập" thuộc tính trong bộ chọn CSS để chỉ truy xuất để khớp với các phần tử của chúng. Tuy nhiên, chỉ là sự hợp nhất và tôi có thể sai; nếu tôi, xin vui lòng một ai đó đúng cho tôi :) Vâng, @ Tim Diggs khẳng định giả thuyết của tôi dưới đây :)

EDIT: Bây giờ bạn có thể làm điều này bằng pseudo-selectors ví dụ:

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

này sẽ trả lại href thuộc tính của mỗi liên kết.

+0

Tôi đã tự tìm ra.Anyways cảm ơn cho câu trả lời – RanRag

+0

@brandizzi, bạn nói đúng - bạn chỉ có thể chọn các phần tử trong css, chứ không phải thuộc tính - dấu ngoặc để lọc yếu tố nào (nhưng không phải là ý tưởng tồi để chỉ chọn các thẻ không có thuộc tính href) đó là những gì một [href] làm). –

+0

@RanRag, bạn nên đánh dấu câu trả lời của brandizzi là chính xác ngay cả khi bạn không cần nó cuối cùng. –

3

Bạn cần phải nhận được thuộc tính trên kết quả của cssselect (nó luôn luôn trả về phần tử, không bao giờ là một thuộc tính):

trước hết, tôi không chắc chắn về doc.cssselect (nhưng có lẽ đây là chức năng riêng của bạn ?)

lxml.cssselect thường được sử dụng:

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

sau đó, giả sử bạn đã có một doc

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

hoặc ngắn gọn hơn:

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

về cơ bản doc tương đương với 'doc = lxml.html.fromstring (nội dung)' trong đó nội dung là dữ liệu html của tôi từ các hàm 'urllib và read' – RanRag

2

Tôi đã sử dụng thành công

#element-id ::attr(value) 

Để có được "giá trị" thuộc tính cho phần tử HTML.

0

lxml cssselector hoạt động với lựa chọn thuộc tính. Đoạn mã dưới đây có thể chọn thuộc tính src từ phần tử HTML script.

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 
Các vấn đề liên quan