Article:
Phân tích cấu trúc HTML với Hpricot
1188
tnd.myopenid.com 17Updated over 3 years ago |
Trong cuốn sách “Ruby Cookbook” tác giả có đề cập đến việc sử dụng rubyful_soup và SGMLParser để phân tích các tệp HTML, tuy nhiên trong bài này tôi sẽ giới thiệu với các bạn về Hpricot, một parser linh hoạt dùng cho cả XML và HTML.
Cài đặt
Cài đặt Hpricot với rubygems rất đơn giản:
$ gem install hpricot
Nếu bạn muốn thử phiên bản đang đưọc phát triển thì có thề làm như sau:
$ gem install hpricot --source http://code.whytheluckystiff.net
Ví dụ sử dụng
Chúng ta hãy xem xét cách phân tích HTML với Hpricot qua ví dụ sau:
1. #!/usr/bin/env ruby
2. require 'rubygems'
3. require 'open-uri'
4. require 'net/http'
5. require 'hpricot'
6.
7. url = 'http://forum.vnoss.org'
8. doc = Hpricot(open("#{url}/help.php"))
9. doc.search('/html/body//img').each do |img|
10. img_path = img.attributes['src']
11. img_url = "#{url}/#{img_path}"
12. if /img\/smilies\/\w+/.match(img_path)
13. fname = img_path.split('/')[2]
14. File.open(fname, 'wb+') {|f| f.write(Net::HTTP.get(URI.parse(img_url))) }
15. end
16. end
Đoạn mã trên sẽ tải về tất cả các tệp hình ảnh chứa mặt cười từ trang VnOSS Help từ dòng 12 đến 14 là tạo tệp hình ảnh cục bộ
- Dòng số 8 dùng hàm open của open-uri để lấy về trang web và đọc thông tin vào trong Hpricot
- Dòng số 9 dùng cú pháp XPath ”/html/body//img” để tìm tất cả các tag “img”
- Dòng số 10 lấy ra giá trị của thuộc tính “src” của “img”. Một khi đã có giá trị về URL của tệp hình, việc còn lại
Với đoạn mã đơn giản trên, bạn đã có thể lấy được thông tin mình cần từ một trang HTML.
Lưu ý
Một số trang web ASP.NET có sử dụng giá trị VIEW_STATE làm cho kích thước của trang web khá lớn. Để parse được các trang này Hpricot cần được cấu hình để có thể sử dụng buffer memory lớn hơn.
Với phiên bản Hpricot >= 0.5 thì ta có thể đặt lại thuộc tính đó như sau
Hpricot.buffer_size = 262144
cho văn bản <= 256KB để tránh bị lỗi OUT OF BUFFER SPACE
Tài liệu tham khảo
Bài tập cho độc giả
Hãy viết lại đoạn mã trên dùng cú pháp CSS thay vì XPath
Ruby căn bản
17
over 3 years ago
over 3 years ago
over 3 years ago