Phân tích cú pháp HTML vớiNokogiri
Nokogiri Nokogiri là một thư viện tuyệt vời giúp việc phân tích cú pháp các định dạng HTML/XML một cách dễ dàng, tốc độ cao. Với những hệ thống yêu cầu thu thập thông tin từ lượng lớn trang web phục vụ cho Data mining thì Nokogiri là lựa chọn hàng đầu. Cài đặt Ubuntu / Debian gem install ...
Nokogiri
Nokogiri là một thư viện tuyệt vời giúp việc phân tích cú pháp các định dạng HTML/XML một cách dễ dàng, tốc độ cao. Với những hệ thống yêu cầu thu thập thông tin từ lượng lớn trang web phục vụ cho Data mining thì Nokogiri là lựa chọn hàng đầu.
Cài đặt
Ubuntu / Debian
gem install nokogiri
Hoặc thực hiện theo hướng dẫn cài đặt chính thức ở đây.
Sử dụng Nokogiri
Cần require các thư viện cần thiết của ruby và nokogiri
#! /usr/bin/env ruby require 'nokogiri' require 'open-uri'
Mở (đọc) một trang web với Nokogiri
Câu lệnh đọc nội dung một file HTML cũng tương tự việc đọc một file văn bản bình thường.
- Đọc nội dung HTML/XML từ một chuỗi
html_doc = Nokogiri::HTML("<html><body><h1>Mr. Belvedere Fan Club</h1></body></html>") xml_doc = Nokogiri::XML("<root><aliens><alien><name>Alf</name></alien></aliens></root>")
html_doc và xml_doc là các đối tượng Class: Nokogiri::XML::Document cung cấp nhiều phương thức để thao tác với dữ liệu cần xử lý, bạn có thể đọc chi tiết tại đây.
- Đọc nội dung HTML/XML từ file
page = Nokogiri::HTML(open("index.html")) puts page.class # => Nokogiri::HTML::Document
- Đọc nội dung HTML/XML từ internet
require 'open-uri' doc = Nokogiri::HTML(open("https://viblo.asia"))
Nokogiri đóng gói tất cả các công việc thực hiện một HTTP request vào phương thức open, giúp việc mở một file từ internet đơn giản như mở một file trên máy local.
Nokogiri và CSS selectors
Giả sử ta có một nội dung HTML như sau
<p> You can <a data-category="news" color="red" href="http://apple.com">click here</a> to get to Apple's website. Click here to get to <a data-category="news" color="red" href="http://www.microsoft.com">Microsoft</a>. <br> Or you can visit w3.org to <a color="red" href="http://www.w3.org">learn more</a> about the World Wide Web. </p>
Và khi được mở trên trình duyệt
You can click here to get to Apple's website. Click here to get to Microsoft.
Or you can visit w3.org to learn more about the World Wide Web.
- Selecting một phần tử
Truyền tên phần tử bạn muốn vào phương thức css của Nokogiri::XML::Document
page = Nokogiri::HTML(open(PAGE_URL)) puts page.css("a")[0].name # => a puts page.css("a")[0].text # => click here
Phương thức css không trả lại text của một phần tử mà nó trả lại một mảng, mà mỗi phần tử là một object kiểu Nokogiri::XML::Element. Mỗi đối tượng Element chứa các phương thức như text trả lại text của một element.
- Lấy một thuộc tính của một phần tử
page = Nokogiri::HTML(open(PAGE_URL)) links = page.css("a") puts links.length # => 3 puts links[0].text # => click here puts links[0]["href"] # => http://apple.com
- Tìm phần tử bằng thuộc tính
news_links = page.css("a[data-category=news]") news_links.each{|link| puts link['href']} #=> http://apple.com #=> http://www.microsoft.com puts news_links.class #=> Nokogiri::XML::NodeSet
Ta thấy phương thức css trả lại một đối tượng Nokogiri::XML::NodeSet là một collection đặc biệt của Nokogiri, chứa các phương thức giúp tìm kiếm, thao tác đến các phần tử trong Node.
Ví dụ muốn tìm các thẻ <strong> bên trong thẻ <a> có thuộc tính data-category=news nằm trong thẻ <p> ta có thể dùng lệnh như sau:
page.css('p').css("a[data-category=news]").css("strong")
- Phần tử con (Nested)
Thay vì sử dụng phương thức css hai lần như ví dụ
page.css('p').css("a").css("strong")
Ta có thể sử dụng nested với chỉ một lần gọi phương thức css
page.css('p a strong')
Kết bài
Nokogiri là gem giúp việc phân tích cú pháp HTML/XML trở nên nhanh và dễ dàng.
Bài viết tham khảo
Nokogiri tutorial
Nokogiri Fundamentals: Extract HTML from the Web
Parsing HTML with Nokogiri