Bạn đang cố gắng phân tích cú pháp HTML bằng Ruby?
Nhiệm vụ này có thể hơi khó khăn nếu bạn không có công cụ phù hợp .
Nhưng hôm nay bạn thật may mắn!
Bởi vì Ruby có thư viện tuyệt vời này được gọi là Nokogiri , giúp cho việc phân tích cú pháp HTML trở thành một chuyến đi dạo trong công viên.
Hãy xem một số ví dụ.
Trước tiên, hãy cài đặt viên ngọc nokogiri với:
gem install nokogiri
Nếu bạn gặp sự cố khi cài đặt gem, hãy thử cách này:
gem install nokogiri -- --use-system-libraries
Cách trích xuất tiêu đề
Sau đó, tạo tập lệnh sau chứa đoạn mã HTML cơ bản sẽ được nokogiri phân tích cú pháp .
Chạy mã này để lấy tiêu đề trang :
require 'nokogiri' html = "test actual content here..." parsed_data = Nokogiri::HTML.parse(html) puts parsed_data.title => "test"
Nếu bạn muốn phân tích cú pháp dữ liệu trực tiếp từ một URL, thay vì một chuỗi HTML…
Bạn có thể làm điều này :
require 'open-uri' Nokogiri::HTML.parse(open('https://example.com')).title
Thao tác này sẽ tải xuống HTML và giúp bạn có được tiêu đề.
Bây giờ :
Lấy tiêu đề là tốt, nhưng bạn có thể muốn xem các ví dụ nâng cao hơn.
Đúng không?
Hãy xem cách trích xuất các liên kết từ một trang web.
Trích xuất liên kết neo
Nếu bạn muốn tất cả các liên kết từ một trang, trước tiên, bạn sẽ cần HTML.
Bạn có thể sử dụng cùng một open-uri
kỹ thuật tải xuống HTML cho bất kỳ trang web công cộng nào.
Sau đó, phân tích cú pháp nó với Nokogiri để có được một đối tượng tài liệu.
Như thế này :
document = Nokogiri::HTML.parse(open('https://example.com')) document.class # Nokogiri::HTML::Document
Bạn có thể truy vấn đối tượng này để biết thông tin theo một trong hai cách:
- Sử dụng các truy vấn XPath
- Sử dụng bộ chọn CSS
Trước tiên, hãy xem cách thực hiện việc này bằng XPath.
Đây là mã :
tags = document.xpath("//a")
Điều đó làm gì?
Điều này lọc qua tất cả các thẻ HTML trong trang và cung cấp cho bạn những thứ bạn đang yêu cầu.
Trong trường hợp này là thẻ “a”.
Những thẻ nào chứa liên kết trong HTML.
Bây giờ :
Những gì bạn có là một mảng Nokogiri::XML::Element
đại diện cho các thẻ này.
Nếu bạn muốn lấy URL và văn bản liên kết, bạn có thể thực hiện việc này:
tags.each do |tag| puts "#{tag[:href]}\t#{tag.text}" end
Thao tác này sẽ in tất cả các liên kết, một liên kết trên mỗi dòng, trên màn hình của bạn.
Nếu thay vì các liên kết mà bạn muốn loại bỏ một số thông tin khác, chẳng hạn như danh sách các hình ảnh có sẵn trên trang, bạn có thể thực hiện theo quy trình tương tự.
Điều duy nhất bạn cần thay đổi là loại thẻ bạn muốn.
Ví dụ :
tags = document.xpath("//img") images_urls = tags.map { |t| t[:src] }
Ở đâu img
là thẻ HTML cho hình ảnh và src
là thuộc tính nơi URL hình ảnh được lưu trữ.
Để tìm bộ chọn và thuộc tính CSS chính xác, hãy sử dụng các công cụ dành cho nhà phát triển của trình duyệt của bạn.
Sử dụng bộ chọn CSS với Nokogiri
Bạn có thể sử dụng bộ chọn CSS bằng cách thay thế xpath
với css
phương pháp.
Đây là một ví dụ :
headers = document.css("h1") paragraphs = document.css("p")
Lưu ý :Sự khác biệt giữa
at_css
&css
là cái đầu tiên chỉ trả về phần tử phù hợp đầu tiên, nhưng cái sau trả về TẤT CẢ các phần tử được so khớp.
Sử dụng CSS mang lại cho bạn kết quả tương tự, toàn bộ điểm là cho Nokogiri biết bạn muốn làm việc với các phần tử HTML nào.
Hầu hết các nhà phát triển quen thuộc với CSS hơn XPath, vì vậy bạn muốn sử dụng CSS.
Tóm tắt
Bạn có thể tìm thấy tài liệu Nokogiri tại đây:
https://www.rubydoc.info/github/sparklemotion/nokogiri
Bạn cũng có thể thích:
Định dạng chuỗi Ruby