Làm cách nào để phân tích cú pháp một trang HTML với Node.js


92

Tôi cần phân tích cú pháp (phía máy chủ) số lượng lớn các trang HTML.
Tất cả chúng ta đều đồng ý rằng regexp không phải là cách để đi đến đây.
Đối với tôi, dường như javascript là cách phân tích cú pháp một trang HTML gốc, nhưng giả định đó dựa vào mã phía máy chủ có tất cả khả năng DOM mà javascript có bên trong trình duyệt.

Node.js có tích hợp sẵn khả năng đó không?
Có cách nào tốt hơn cho vấn đề này, phân tích cú pháp HTML ở phía máy chủ không?

Câu trả lời:


87

Bạn có thể sử dụng NPM module jsdomHTMLParser để tạo ra và phân tích một DOM trong Node.JS.

Các tùy chọn khác bao gồm:

  • BeautifulSoup cho python
  • bạn có thể chuyển đổi html sang xhtml và sử dụng XSLT
  • HTMLAgilityPack dành cho .NET
  • CsQuery cho .NET (yêu thích mới của tôi)
  • Các công cụ spidermonkey và tê giác JS có hỗ trợ E4X. Điều này có thể hữu ích, chỉ khi bạn chuyển đổi html của mình thành xhtml.

Trong số tất cả các tùy chọn này, tôi thích sử dụng tùy chọn Node.js hơn, vì nó sử dụng các phương thức truy cập DOM W3C tiêu chuẩn và tôi có thể sử dụng lại mã trên cả máy khách và máy chủ. Tôi ước gì các phương pháp của BeautifulSoup giống với dom W3C hơn và tôi nghĩ rằng việc chuyển đổi HTML của bạn sang XHTML để viết XSLT chỉ đơn giản là tàn bạo.


3
Ý bạn là gì tốt? Đáng tin cậy, nhanh chóng, dễ dàng? Với hai điều này, nó đủ mạnh để bạn có thể sử dụng jQuery serveride nếu muốn .
kzh

1
@kzh Đối với tôi, đáng tin cậy và dễ dàng quan trọng hơn nếu quy trình kết thúc sau một giờ hoặc một ngày.
Itay Moav -Malimovka

Tôi muốn nói rằng tùy chọn nút là đáng tin cậy và chắc chắn dễ dàng nếu bạn đã quen với DOM.
kzh

Nếu bạn sử dụng htmlparser, hãy thử sử dụng github.com/fb55/node-htmlparser trước. Nó dường như là một phiên bản được làm lại và được bảo trì tích cực hơn.
cburgmer

Tôi đã tìm kiếm khắp nơi trên internet, nhưng không thể tìm thấy một hướng dẫn tốt cho HTMLParser ..
songyy

62

Sử dụng Cheerio . Nó không nghiêm ngặt như jsdom và được tối ưu hóa để cạo. Như một phần thưởng, hãy sử dụng các bộ chọn jQuery mà bạn đã biết.

❤ Cú pháp quen thuộc: Cheerio triển khai một tập con của jQuery lõi. Cheerio loại bỏ tất cả các mâu thuẫn DOM và lỗi trình duyệt khỏi thư viện jQuery, tiết lộ API thực sự tuyệt đẹp của nó.

ϟ Nhanh chóng mặt: Cheerio hoạt động với một mô hình DOM rất đơn giản, nhất quán. Kết quả là phân tích cú pháp, thao tác và kết xuất cực kỳ hiệu quả. Các tiêu chuẩn sơ bộ từ đầu đến cuối cho thấy cheerio nhanh hơn JSDOM khoảng 8 lần.

❁ Cực kỳ linh hoạt: Cheerio kết luận về htmlparser tha thứ của @ FB55. Cheerio có thể phân tích cú pháp gần như bất kỳ tài liệu HTML hoặc XML nào.


8
Nhưng không xây dựng DOM và không cho phép XPath. Cú pháp jQuery chắc chắn là một nhược điểm của thư viện đó.
polkovnikov.ph

2
@ polkovnikov.ph theo kinh nghiệm của tôi, rất ít ứng dụng yêu cầu phân tích cú pháp DOM đầy đủ và việc xây dựng DOM rất tốn kém so với đánh giá "lười biếng" nhanh trong jQuery / Cheerio. Theo nghĩa này, phân tích cú pháp kiểu jQuery là một lợi ích, nhưng nếu ứng dụng của bạn yêu cầu thao tác phía máy chủ DOM, bạn có thể thích thử jsdom.
Meekohi

jsdomquá chậm cho điều đó: /
polkovnikov.ph

2
@MohamedMansour cho những gì đáng giá chúng tôi đang sử dụng Cheerio trong sản xuất và cắt hàng nghìn trang trong vài giây. "nhanh" và "chậm" tất nhiên là liên quan đến ứng dụng và băng thông của bạn.
Meekohi

Không nghiêm ngặt: +1. Cú pháp jQuery: +1.
pho mát


6

Htmlparser2 của FB55 có vẻ là một lựa chọn thay thế tốt.


3
Và người ta nên làm gì với định dạng trả về này ? Viết một loạt các vòng lặp for và các đường truyền cây?
polkovnikov.ph

Bạn có thể đăng ký các sự kiện thẻ mở / đóng, vì vậy tùy thuộc vào những gì bạn muốn, đây là một imho thay thế thực sự tốt.
Phil

@ polkovnikov.ph Ngoài ra còn có gói domutils của cùng một tác giả hoạt động với định dạng được trả về bởi htmlparser2 - nó có rất nhiều phương thức, một số có cú pháp giống với phương thức DOM, một số khác; bạn sẽ không thực sự cần phải di chuyển đối tượng theo cách thủ công. Không có tài liệu ở đó, nhưng mã nguồn siêu rõ ràng - tất cả đều hoạt động như bạn mong đợi.
đặc biệt

chưa, nhưng điều gì ngăn bạn mở rộng nó? không quá khó khi sử dụng các chức năng mà nó đã có.
đặc biệt

2

jsdom quá nghiêm ngặt để thực hiện bất kỳ loại hình ảnh cạo màn hình thực nào, nhưng beautifulsoup không gây khó khăn cho việc đánh dấu xấu.

node-soupselect là một cổng ghép hình đẹp của python vào nodejs và nó hoạt động rất đẹp

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.