Tool zum Zerlegen von Websites gesucht

bitmuncher

Senior-Nerd
Klingt spannend, oder? ;) Ist es aber nicht... Ich suche ein Tool, das den Content einer Website in seine Bestandteile zerlegen kann. Dabei sollte es optimalerweise möglich sein zu definieren welche Tag-IDs/Namen relevant sind. Beispiel: Ich habe eine HTML-Datei die aus diversen DIVs besteht, die alle eindeutig benannt sind. Ich möchte nun aus bestimmten DIVs den Content extrahieren und in eine Datenbank schreiben oder in einer XML-Struktur abspeichern.

Kennt jemand was passendes oder ein OSS-Tool, das man entsprechend modifizieren kann, so dass es die gewünschte Aufgabe übernehmen kann?
 
Obwohl eigentlich keine "Applikation" im klassischen Sinne, fällt mir hier SizzleJS ein.

A pure-JavaScript CSS selector engine designed to be easily dropped in to a host library.

In Verbindung mit (bsp.) Greasemonkey würde sich das was machen lassen.

(SizzleJs ist übrigens Bestandteil von jQuery)
 
Bei Perl eignet sich Web::Scraper dafür. Habe ich genutzt um bspw. Wikipedia auszulesen (Beispiel)

Hier mal der relevant Codeausschnitt:

Code:
  32    $scrap = scraper {
  33       process '//div[@id="bodyContent"]/p', 'text[]' => 'TEXT';
  34       process '//img', 'img[]' => '@src';
  35       process '//div[@id="bodyContent"]/ul/li', 'list[]' => 'TEXT';
  36       process '//table/tr/td', 'table[]' => 'TEXT';
  37    };
  38    $url = URI->new($wikiurl);
  39 
  40    my $res = $scrap->scrape($url);
  41    my $text = $res->{'text'};
  42    my $img = $res->{'img'};
  43    my $list = $res->{'list'};
  44    my $table = $res->{'table'};
 
@xrayn:
dann führe doch mal aus ;)
Code:
>>> from xml.etree.ElementTree import ElementTree
>>> import urllib
>>> content=urllib.urlopen("http://hackerboard.de").read()
>>> tree=ElementTree.fromstring(content)
Es mag nicht wirklich HTML.
Ich würde eher zu BeautifulSoup tendieren:
Beautiful Soup documentation
Code:
>easy_install BeautifulSoup
>python
>>> import urllib
>>> content=urllib.urlopen("http://hackerboard.de").read()
>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup(content)
>>> divs = soup.findAll('div', id="wrapper")
>>> divs[0].contents[1]
<div id="header-tabs"><a href="http://wiki.hackerboard.de" title="Hackerboard Wi
ki"><img src="http://www.hackerboard.de/images/habo/misc/wiki_tab.png" border="0" alt="Hackerboard Wiki" /
></a><a href="http://www.haboweb.de" title="HaboWeb Linkverzeichnis"><img src="i
mages/habo/misc/haboweb_tab.png" border="0" alt="HaboWeb Linkverzeichnis" /></a>
</div>
>>> divs[0].contents[1].find("img")
<img src="http://www.hackerboard.de/images/habo/misc/wiki_tab.png" border="0" alt="Hackerboard Wiki" />
oder
Code:
>>> all_divs = soup.findAll("div", id = re.compile("w.*"))
>>> [div.get("id") for div in all_divs]
[u'wrapper', u'rounded-wrap']
>>> all_divs[0].find("img")
<img src="http://www.hackerboard.de/images/habo/misc/wiki_tab.png" border="0" alt="Hackerboard Wiki" />
also z.B
alle divs in einen Dict und dann zu XML
Code:
>>> divs = dict([(div.get("id"), div.contents) for div in soup.findAll("div")])
>>> divs.keys()
[u'wrapper', u'rounded-wrap', u'navbsr', u'footer', u'rounded-top', u'footer-tex
t', u'rounded-bottom', None, u'naeXTReMe', u'header-tabs']
>>> import sys
>>> from xml.dom.minidom import *
>>> doc = Document();
>>> root = doc.createElement("mydivs")
>>> doc.appendChild(root)
<DOM Element: mydivs at 0x35ed688>
>>> for id, contents in divs.items():
...   if not(id):
...       continue
...   node = doc.createElement(id)
...   root.appendChild(node)
...   for content in contents:
...     try:
...       node.appendChild(doc.createTextNode(str(content.text[:20])))
...     except AttributeError:
...       pass
Code:
>>> print doc.toprettyxml(indent='\t')
<?xml version="1.0" ?>
<mydivs>
        <wrapper>

                [HaBo]
                RegistrierenTutorial

                BenutzernameKennwort
                Impressum-KontaktHac
        </wrapper>
        <rounded-wrap>

                BenutzernameKennwort
                &nbsp;
                <!--
google_ad_clie
                Alle Zeitangaben in

        </rounded-wrap>
        <navbsr>
                BenutzernameKennwort
                Willkommen im [HaBo]
        </navbsr>
        <footer>
                Impressum-KontaktHac
                -- HaBo 2.0-- Z Seri
        </footer>
        <rounded-top>

        </rounded-top>
        <footer-text>
                13:49

                vBulletin Skins
                ForumMonkeys

        </footer-text>
        <rounded-bottom>

        </rounded-bottom>
        <naeXTReMe>

        </naeXTReMe>
        <header-tabs>


        </header-tabs>
</mydivs>
 
Danke erstmal für die vielen Tipps. Ein fertiges Tool wäre zwar besser, aber ich schau mal, was ich da zusammenschrauben kann. :)
 
Wozu ein Tool, wenn es das DOM gibt?
What is the DOM?

The DOM is a W3C (World Wide Web Consortium) standard.
The DOM defines a standard for accessing documents like HTML and XML:
"The W3C Document Object Model (DOM) is a platform and language-neutral interface that allows programs and scripts to dynamically access and update the content, structure, and style of a document."

HTML DOM Tutorial
 
Wozu selbst was coden, wenn es evtl. ein passendes Tool bereits gibt? Und um rauszubekommen, ob es ein solches Tool bereits gibt, gibt's diesen Thread. :rolleyes:

Abgesehen davon ist DOM nur eine Spezifikation. Die bringt in Sachen Arbeitsersparnis mal so überhaupt nichts.

Ich glaube mit einem DOM Parser bist du besser beholfen, als dich im Internet tot-zu-suchen nach einem OSS Projekt, was ggf. dann nicht einmal deinen Erwartungen entspricht.
 
Naja, musst du die extrahierten Daten irgendwie parsen können? Oder gehts dir rein um die Information?

(Edit: sry für die Frage, habs soeben gelesen. Ich lass es trotzdem mal stehn ;))

Wie wärs beispielsweise mit XPath? Ich benutze dies teilweise in Kombination mit Firebug (Plugin fürs Plugin).

xpath.png


Ich schätze es gibt auch andere Implementationen, falls dir FF/Firebug nicht zusagt. Allerdings unter uns: Natürlich ist dies DOM-Parsing sehr nah, aber vielleicht hilft ja nur schon das Stichwort.
 
Zuletzt bearbeitet:
Zurück
Oben