NokogiriAan de slag met Nokogiri


Opmerkingen

Deze sectie geeft een overzicht van wat Nokogiri is en waarom een ontwikkelaar het misschien wil gebruiken.

Het moet ook alle grote onderwerpen binnen Nokogiri vermelden en een link naar de gerelateerde onderwerpen bevatten. Aangezien de documentatie voor Nokogiri nieuw is, moet u mogelijk eerste versies van die gerelateerde onderwerpen maken.

Hoe te controleren op parseerfouten

Nokogiri lijkt een beetje op een browser, omdat het probeert iets nuttigs te bieden, zelfs als de inkomende HTML of XML onjuist is opgemaakt. Helaas doet het het meestal stil, maar we kunnen om een lijst met fouten vragen met errors :

require 'nokogiri'

doc = Nokogiri::XML('<node><foo/>')
doc.errors
# => [#<Nokogiri::XML::SyntaxError: 1:13: FATAL: Premature end of data in tag node line 1>]
 

terwijl de juiste XML geen fouten zou opleveren:

doc = Nokogiri::XML('<node><foo/></node>')
doc.errors
# => []
 

Dit geldt ook voor het parseren van HTML, maar omdat HTML een ontspannen vorm van XML is, zal Nokogiri vaak ontbrekende eindknooppunten passeren en alleen misvormde knooppunten en meer pathologische fouten melden:

doc = Nokogiri::HTML('<html><body>')
doc.errors
# => []

doc = Nokogiri::HTML('<html><body><p')
doc.errors
# => [#<Nokogiri::XML::SyntaxError: 1:15: ERROR: Couldn't find end of Start Tag p>]
 

Als u na het parseren geen knooppunt kunt vinden dat u in uw editor kunt zien, kan dit de oorzaak van het probleem zijn. Soms helpt het om de HTML door een formatter te halen en te kijken of het nestelen helpt het probleem aan het licht te brengen.

En omdat Nokogiri het probleem probeert op te lossen, maar het soms niet correct kan doen, omdat het voor software erg moeilijk kan zijn om te doen, moeten we het bestand voorbewerken en lijnen bijwerken voordat het wordt overgedragen naar Nokogiri. Hoe dat moet, hangt af van het bestand en het probleem. Het kan variëren van het eenvoudig vinden van een knooppunt en het toevoegen van een volgnummer > tot het verwijderen van ingebedde verkeerd gevormde markeringen die werden geïnjecteerd door een slechte schraaproutine, dus het is aan de programmeur hoe hij het beste kan bemiddelen.

Hoe tekst uit een knooppunt of knooppunten te extraheren

Hoe tekst correct te extraheren is uit knooppunten is een van de meest populaire vragen die we zien, en wordt bijna altijd moeilijker gemaakt door de "zoek" -methoden van Nokogiri te misbruiken.

Nokogiri ondersteunt het gebruik van CSS- en XPath-selectors. Deze zijn equivalent:

doc.at('p').text   # => "foo"
doc.at('//p').text # => "foo"

doc.search('p').size   # => 2
doc.search('//p').size # => 2
 

De CSS-selectors zijn voor het gemak uitgebreid met veel van de CSS-extensies van jQuery .

at en search zijn generieke versies van at_css en at_xpath samen met css en xpath . Nokogiri doet een poging om te bepalen of een CSS of XPath selector wordt doorgegeven. Het is mogelijk om een selector te creëren die dwazen at of search zo nu en dan zal het verkeerd, dat is waarom we hebben de meer specifieke versies van de methoden. Over het algemeen gebruik ik de generieke versies bijna altijd en gebruik ik de specifieke versie alleen als ik denk dat Nokogiri het verkeerd zal begrijpen. Deze praktijk valt onder de eerste vermelding in " Three Virtues ".

Als u op zoek bent naar een specifiek knooppunt en de tekst wilt, gebruik dan at of een van de varianten at_css of at_xpath :

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<html>
  <body>
    <p>foo</p>
    <p>bar</p>
  </body>
</html>
EOT

doc.at('p').text # => "foo"
 

at is gelijk aan search(...).first , dus u zou de langere versie kunnen gebruiken, maar waarom?

Als de geëxtraheerde tekst wordt samengevoegd na het gebruik van search , css of xpath , voeg dan map(&:text) plaats van eenvoudigweg text :

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<html>
  <body>
    <p>foo</p>
    <p>bar</p>
  </body>
</html>
EOT

doc.search('p').text        # => "foobar"
doc.search('p').map(&:text) # => ["foo", "bar"]
 

Raadpleeg de text voor NodeSet en Node voor aanvullende informatie.

Hoe HTML of XML te parseren in een Nokogiri XML- of HTML-document

Er is niet veel toe te voegen aan de zelfstudie "Parsing an HTML / XML Document " van Nokogiri, wat een gemakkelijke inleiding tot het onderwerp is, dus begin daar en keer dan terug naar deze pagina om een aantal hiaten te vullen.

Nokogiri's basisparsing probeert een verkeerd opgemaakt document op te ruimen, soms met ontbrekende afsluitende tags, en zal enkele extra tags toevoegen om het te corrigeren.

Dit is een voorbeeld van het vertellen van Nokogiri dat het document dat wordt ontleed een compleet HTML-bestand is, en Nokogiri ontdekt dat het niet is:

require 'nokogiri'

doc = Nokogiri::HTML('<body></body>')
puts doc.to_html 
 

Welke uitgangen:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body></body></html>
 

Merk op dat de DTD-instructie is toegevoegd, samen met een <html> -tag.

Als we dit willen voorkomen, kunnen we het document parseren als een DocumentFragment:

require 'nokogiri'

doc = Nokogiri::HTML.fragment('<body></body>')
puts doc.to_html 
 

die nu alleen uitvoert wat daadwerkelijk is doorgegeven:

<body></body>
 

Er is ook een XML-variant:

require 'nokogiri'

doc = Nokogiri::XML('<node />')
puts doc.to_xml
 

Welke uitgangen:

<?xml version="1.0"?>
<node/>
 

en:

doc = Nokogiri::XML.fragment('<node />')
puts doc.to_xml
 

met als resultaat:

<node/>
 

Een meer uitgebreide variatie van fragment is om DocumentFragment.parse te gebruiken, dus soms zie je het op die manier geschreven.

Af en toe zal Nokogiri wat aanpassingen moeten doen om het document te begrijpen:

doc = Nokogiri::XML::DocumentFragment.parse('<node ><foo/>')
puts doc.to_xml
 

Met de gewijzigde code nu:

<node>
  <foo/>
</node>
 

Hetzelfde kan gebeuren met HTML.

Soms is het document vervormd buiten het vermogen van Nokogiri om het te repareren, maar het zal het toch proberen, wat resulteert in een document met een gewijzigde hiërarchie. Nokogiri zal geen uitzondering maken, maar het biedt wel een manier om te controleren op fouten en de acties die het heeft ondernomen. Zie " Controleren op parseerfouten " voor meer informatie.

Zie de documentatie van Nokogiri :: XML :: ParseOptions voor verschillende opties die worden gebruikt bij het parseren.

Installatie of instellingen

Gedetailleerde instructies voor het instellen of installeren van Nokogiri.