2016-12-06 4 views
1

Ich habe externe HTML-Site und ich muss Daten aus der Tabelle auf dieser Website extrahieren. Allerdings Quelle der HTML-Webseite hat falsche Formatierung außer der Tabelle im Code, so kann ich nichtTeil des Codes extrahieren und HTML in BASH analysieren

xmllint --html --xpath <xpath> <file> 

verwenden, weil es nicht richtig funktioniert, wenn HTML-Formatierung auf der Website ist gebrochen.

Meine Idee war es, curl und löschen Sie den Code über und unter der Tabelle. Wenn die Tabelle extrahiert wird, ist der Code sauber und passt zu xmllint Werkzeug (ich kann Xpath dann verwenden). Allerdings löschen Sie alles über dem Spiel ist schwierig für die Shell, wie Sie hier sehen können: Sed doesn't backtrack: once it's processed a line, it's done. Gibt es eine Möglichkeit, nur den Code der Tabelle aus der HTML-Site in bash extrahieren? Supose, Code hat diese Struktur.

<html> 
<head> 
</head> 
<body> 
<p>Lorem ipsum ....</p> 
    <table class="my-table"> 
    <tr> 
     <th>Company</th> 
     <th>Contact</th> 
    </tr> 
    </table> 
<p>... dolor.</p> 
</body> 
</html> 

Und ich brauche eine Ausgabe wie diese Daten richtig zu analysieren:

<table class="my-table"> 
    <tr> 
     <th>Company</th> 
     <th>Contact</th> 
    </tr> 
    </table> 

Bitte, gib mir nicht minus wegen versuchen, bash zu verwenden.

+0

Sie extrahieren können diesen Artikel überprüfen: http://www.joyofdata.de/blog/using-linux-shell-web-scraping/ – Hackerman

+0

Haben Sie versucht, den HTML-Code mit HTML-Tidy http://www.html-tidy.org/ –

+0

zu reinigen Ich habe es versucht " tidy -ashtml page.html -output page2.html "aber leider gibt es" Dieses Dokument hat Fehler, die behoben werden müssen, bevor HTML Tidy verwendet wird, um eine aufbereitete Version zu erstellen. " Es muss vollautomatisch sein. Trotzdem [email protected] Dan-Dev –

Antwort

3

Ich werde die Antwort brechen, die ich xmllint versucht mit, die für die Analyse html Dateien

erstens einen --html Flag unterstützt, können Sie die geistige Gesundheit der HTML-Datei überprüfen, indem es wie, unter dem Parsen bestätigt, wenn die Datei wie gemäß den Standards oder Fehler wirft, wenn gesehen: -

$ xmllint --html YourHTML.html 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
<html> 
<head> 
</head> 
<body> 
<p>Lorem ipsum ....</p> 
    <table class="my-table"> 
    <tr> 
     <th>Company</th> 
     <th>Contact</th> 
    </tr> 
    </table> 
<p>... dolor.</p> 
</body> 
</html> 

mit meiner ursprünglichen YourHTML.html Datei nur die Eingabe HTML-Datei in Frage zu sein.

Jetzt für den Wert Extraktionsteil: -

die Datei ab Wurzelknoten zu dem der table Knoten (//html/body/table) und läuft xmllint in HTML-Parser & interaktive Shell-Modus (xmllint --html --shell)

Lauf Parsen der Befehl erzeugt deutlich ein Ergebnis,

$ echo "cat //html/body/table" | xmllint --html --shell YourHTML.html 
/> ------- 
<table class="my-table"> 
    <tr> 
     <th>Company</th> 
     <th>Contact</th> 
    </tr> 
    </table> 
/> 

nun die Sonderzeichen zu entfernen mit sed dh produziert

$ echo "cat //html/body/table" | xmllint --html --shell YourHTML.html | sed '/^\/ >/d' 
<table class="my-table"> 
    <tr> 
     <th>Company</th> 
     <th>Contact</th> 
    </tr> 
    </table> 

Das ist die Ausgabestruktur wie erwartet. Getestet auf xmllint: using libxml version 20900

Ich gehe noch einen Schritt weiter, und wenn Sie die Werte innerhalb des table Tag holen wollen, können Sie den sed Befehl gelten sie als

$ echo "cat //html/body/table" | xmllint --html --shell YourHTML.html | sed '/^\/ >/d' | sed 's/<[^>]*.//g' | xargs 
Company Contact 
+0

Dieser Code funktioniert perfekt, wenn HTML gültig ist und nicht kaputt ist. Aber ich kann das in meinem Fall nicht anwenden (Entschuldigung für das vereinfachte irreführende Beispiel). Offensichtlich haben viele Webseiten keinen gültigen HTML-Code, so dass ich keine Daten von ihnen analysieren könnte. Nehmen wir an, dass nur gültiger Code innerhalb der Tabelle ist. Leider muss ich zugeben, dass Bash nicht wirklich geeignet ist, einen Teil des Codes auf einer Webseite zu extrahieren, die nicht den W3C-Standards entspricht. Kennen Sie eine Option, wie Sie Tabellen anders extrahieren können? –

+0

Ich fand schließlich, dass diese Lösung perfekt mit der @ Dan-Dev Empfehlung funktioniert, ordentlich mit option force-output zu verwenden: ja –

Verwandte Themen