2012-04-07 7 views

Antwort

4

Ich bin mir nicht sicher, ob Sie bedeuten diese \n getrennte Liste (oder einen in Klammern und durch Komma getrennt)

html='http://www.geonames.org/postalcode-search.html?q=london&country=GB' 
wget -q "$html" -O - | 
    w3m -dump -T 'text/html'| 
    sed -nr 's/^ +[0-9]+ +(.*) +[A-Z]+[0-9]+ +United Kingdom.*/\1/p' 

w3m ist: "WWW durchsuchbaren Pager mit ausgezeichneten Tabellen/Frames unterstützen"

Ausgang (erste 10 Zeilen)

London Bridge 
Kilburn   
Ealing   
Wandsworth  
Pimlico   
Kensington  
Leyton   
Leytonstone  
Plaistow   
Poplar   
1

Ich sehe die Website bietet (aber nicht kostenlos) Web-Services mit XML oder JSON-Daten ... Es wäre der beste Weg, da die HTML-Seite nicht (leicht) geparst werden soll.

Wie auch immer, nichts ist unmöglich, nichtsdestotrotz wäre die Verwendung von streng nur bash-Befehlen sehr schwer, wenn nicht unmöglich; oft werden mehrere andere gebräuchliche Werkzeuge verwendet, um das Ergebnis zu erzielen. Aber dann wird es manchmal praktischer, sich an ein einzelnes Werkzeug wie z.B. Perl, anstatt cat, grep, awk, sed und was auch immer zu kombinieren.

So etwas wie

sed -e 's/>/>\n/g' region.html | 
    egrep -i "^\s*[A-Z]+[0-9]+</td>" | 
    sed -e 's|</td>||g' 

arbeitete 200 Zeilen extrahieren, ein bestimmtes Format für den Code angenommen.

ADD

Wenn es an der Software keine Begrenzung ist können Sie die Daten zu analysieren, verwenden, dann könnten Sie eine Zeile wie

wget -q "http://www.geonames.org/postalcode-search.html?q=london&country=GB" -O - | 
    sgrep '"<table class=\"restable\"" .. "</table>"' | 
    sed -e 's|/tr>|/tr>\n|g; s|</td>\s*<td[^>]*>|;|g; s|</th>\s*<th[^>]*>|;|g; s|<[^>]\+>||g; s|;;&nbsp;.*$| |g' | 
    grep -v "^\s*$" | 
    tail -n+2 | cut -d";" -f2,3 

verwenden, die von einem ; getrennt Orte und Postleitzahlen extrahiert wie in einer CSV, sowie awk:

wget -q "$html" -O - | 
    w3m -dump -T 'text/html' | 
    awk '/\s*[0-9]+/{ print substr($0, 11, 16); }' 

, die sich auf die Antwort von Peter.O basiert und extrahiert die gleichen Daten ... und so weiter. Da Sie in diesen Fällen jedoch nicht auf die minimalen Werkzeuge beschränkt sind, die auf den meisten Unix- oder GNU-Systemen zu finden sind, würde ich bei einem einzigen weit verbreiteten Werkzeug bleiben, z. Perl.

+0

natürlich ist es nicht die einzige Möglichkeit – ShinTakezou

+0

(und natürlich, das extrahiert Postleitzahl Kennung, keine Orte) – ShinTakezou

+0

Es tut mir leid, aber diese Antwort ist ein Durcheinander. Es wurde schon so oft gesagt, Sie sollten nie versuchen, HTML mit Regex zu analysieren. – pguardiario

0

Wenn Sie haben Zugriff auf die mojo Werkzeug aus dem Mojolicious Projekt das alles wird ziemlich viel einfacher:

mojo get 'http://www.geonames.org/postalcode-search.html?q=london&country=GB' '.restable > tr > td:nth-child(2)' text | grep ^'[a-zA-Z]' 

Die grep am Ende gerade ist einige Junk-Ergebnisse herauszufiltern; fast (aber nicht ganz) ist jede zweite Zeile schlecht, da die Seitenstruktur etwas inkonsistent ist. Sonst könnte man sagen tr:nth-child(even) und nette Ergebnisse bekommen.