jsdomvsnokogiri
jsdom is a pure JavaScript implementation of web standards, notably the WHATWG DOM and HTML standards, for use with Node.js. It simulates a browser environment in Node.js, allowing you to parse HTML, manipulate the DOM, and interact with web pages using the same APIs available in web browsers.
Key features for web scraping:
- Full DOM implementation Provides document.querySelector, document.querySelectorAll, and other standard DOM methods for traversing and manipulating parsed HTML.
- Browser-like environment Simulates window, document, navigator, and other browser globals, enabling code that was written for browsers to run in Node.js.
- JavaScript execution Can execute JavaScript embedded in HTML pages, including external scripts, making it possible to process pages that generate content dynamically (though much slower than a real browser).
- Standards-compliant parsing Uses the same HTML parsing algorithm as web browsers (the WHATWG HTML specification), ensuring accurate handling of malformed HTML.
- Cookie support Implements the tough-cookie library for cookie handling across requests.
For web scraping, jsdom is useful when you need more than simple CSS selector matching (what cheerio provides) but don't need a full browser. It's ideal for parsing complex HTML and running simple inline scripts without the overhead of Playwright or Puppeteer. However, for heavy JavaScript-rendered pages, a real browser automation tool is recommended.
Nokogiri is a Ruby gem that provides a simple and powerful way to parse and search XML and HTML documents. It is built on top of the underlying C library libxml2, which is known for its speed and reliability.
Nokogiri provides a simple and intuitive API for parsing and searching XML and HTML documents, and it is widely used in the Ruby ecosystem for web scraping and data extraction.
One of the main features of Nokogiri is its ability to search and navigate through XML and HTML documents using a CSS or XPath selectors.
Nokogiri also provides a variety of other features that can simplify the process of working with XML and HTML documents. It can automatically handle character encodings and normalize documents, it can parse and search large documents with low memory usage, and it can validate documents against a DTD or schema.
Highlights
Example Use
Product A
$10.99Product B
$24.99
</body>
`;
const dom = new JSDOM(html); const document = dom.window.document;
// Use standard DOM APIs to extract data
const products = document.querySelectorAll('.product');
products.forEach(product => {
const name = product.querySelector('h2').textContent;
const price = product.querySelector('.price').textContent;
console.log(${name}: ${price});
});
// Fetch and parse a remote page JSDOM.fromURL('https://example.com').then(dom => { const title = dom.window.document.title; console.log('Page title:', title); }); ```
```ruby require 'nokogiri'
html_string = '
Hello World!
This is a sample webpage.
'Parse the HTML string
doc = Nokogiri::HTML(html_string)
Extract the class attribute of h1 tag using CSS selector
h1_class = doc.css("h1")[0]['class']
or XPath
h1_class = doc.xpath("//h1")[0]['class'] puts "H1 class: #{h1_class}" ```