Trị liệu - Bộ chọn

Sự miêu tả

Khi bạn đang tìm kiếm các trang web, bạn cần trích xuất một phần nhất định của nguồn HTML bằng cách sử dụng cơ chế được gọi là selectors, đạt được bằng cách sử dụng biểu thức XPath hoặc CSS. Bộ chọn được xây dựng dựa trênlxml thư viện, xử lý XML và HTML bằng ngôn ngữ Python.

Sử dụng đoạn mã sau để xác định các khái niệm khác nhau về bộ chọn -

<html>
   <head>
      <title>My Website</title>
   </head>
   
   <body>
      <span>Hello world!!!</span>
      <div class = 'links'>
         <a href = 'one.html'>Link 1<img src = 'image1.jpg'/></a>
         <a href = 'two.html'>Link 2<img src = 'image2.jpg'/></a>
         <a href = 'three.html'>Link 3<img src = 'image3.jpg'/></a>
      </div>
   </body>
</html>

Xây dựng bộ chọn

Bạn có thể xây dựng các cá thể lớp bộ chọn bằng cách chuyển text hoặc là TextResponsevật. Dựa trên loại đầu vào được cung cấp, bộ chọn chọn các quy tắc sau:

from scrapy.selector import Selector 
from scrapy.http import HtmlResponse

Sử dụng đoạn mã trên, bạn có thể tạo từ văn bản dưới dạng:

Selector(text = body).xpath('//span/text()').extract()

Nó sẽ hiển thị kết quả là -

[u'Hello world!!!']

Bạn có thể xây dựng từ phản hồi dưới dạng:

response = HtmlResponse(url = 'http://mysite.com', body = body) 
Selector(response = response).xpath('//span/text()').extract()

Nó sẽ hiển thị kết quả là -

[u'Hello world!!!']

Sử dụng Bộ chọn

Sử dụng đoạn mã đơn giản ở trên, bạn có thể tạo XPath để chọn văn bản được xác định trong thẻ tiêu đề như được hiển thị bên dưới -

>>response.selector.xpath('//title/text()')

Bây giờ, bạn có thể trích xuất dữ liệu văn bản bằng cách sử dụng .extract() phương pháp hiển thị như sau:

>>response.xpath('//title/text()').extract()

Nó sẽ tạo ra kết quả là -

[u'My Website']

Bạn có thể hiển thị tên của tất cả các phần tử như sau:

>>response.xpath('//div[@class = "links"]/a/text()').extract()

Nó sẽ hiển thị các phần tử là -

Link 1
Link 2
Link 3

Nếu bạn muốn trích xuất phần tử đầu tiên, hãy sử dụng phương pháp .extract_first(), được hiển thị như sau -

>>response.xpath('//div[@class = "links"]/a/text()').extract_first()

Nó sẽ hiển thị phần tử là -

Link 1

Bộ chọn lồng

Sử dụng mã trên, bạn có thể lồng các bộ chọn để hiển thị liên kết trang và nguồn hình ảnh bằng cách sử dụng .xpath() phương pháp, được hiển thị như sau:

links = response.xpath('//a[contains(@href, "image")]') 

for index, link in enumerate(links): 
   args = (index, link.xpath('@href').extract(), link.xpath('img/@src').extract()) 
   print 'The link %d pointing to url %s and image %s' % args

Nó sẽ hiển thị kết quả là -

Link 1 pointing to url [u'one.html'] and image [u'image1.jpg']
Link 2 pointing to url [u'two.html'] and image [u'image2.jpg']
Link 3 pointing to url [u'three.html'] and image [u'image3.jpg']

Bộ chọn sử dụng biểu thức chính quy

Scrapy cho phép trích xuất dữ liệu bằng cách sử dụng biểu thức chính quy, sử dụng .re()phương pháp. Từ đoạn mã HTML trên, chúng tôi sẽ trích xuất các tên hình ảnh như sau:

>>response.xpath('//a[contains(@href, "image")]/text()').re(r'Name:\s*(.*)')

Dòng trên hiển thị tên hình ảnh là:

[u'Link 1', 
u'Link 2', 
u'Link 3']

Sử dụng XPath tương đối

Khi bạn đang làm việc với XPath, bắt đầu với /, bộ chọn lồng nhau và XPath có liên quan đến đường dẫn tuyệt đối của tài liệu chứ không phải đường dẫn tương đối của bộ chọn.

Nếu bạn muốn giải nén <p> các phần tử, sau đó trước tiên lấy tất cả các phần tử div -

>>mydiv = response.xpath('//div')

Tiếp theo, bạn có thể giải nén tất cả 'p' các phần tử bên trong, bằng cách đặt trước XPath bằng một dấu chấm là .//p như hình dưới đây -

>>for p in mydiv.xpath('.//p').extract()

Sử dụng Tiện ích mở rộng EXSLT

EXSLT là một cộng đồng phát hành các phần mở rộng cho XSLT (Phép biến đổi ngôn ngữ biểu định kiểu mở rộng) để chuyển đổi tài liệu XML sang tài liệu XHTML. Bạn có thể sử dụng các phần mở rộng EXSLT với không gian tên đã đăng ký trong các biểu thức XPath như được hiển thị trong bảng sau:

Sr.No Tiền tố & Cách sử dụng Không gian tên
1

re

biểu thức chính quy

http://exslt.org/regexp/index.html

2

set

thiết lập thao tác

http://exslt.org/set/index.html

Bạn có thể kiểm tra định dạng mã đơn giản để trích xuất dữ liệu bằng cách sử dụng biểu thức chính quy trong phần trước.

Có một số mẹo XPath hữu ích khi sử dụng XPath với bộ chọn Scrapy. Để biết thêm thông tin, hãy nhấp vào liên kết này .