12/08/2018, 13:57

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

0