Frage

Ich versuche XPath verwenden, um einige HTML-Tags und Daten zu extrahieren und für die ich zu verwenden XML::LibXML Modul benötigen.

Ich habe versucht, es von CPAN Shell installieren, aber es lässt sich nicht installieren.

Ich folgte den Anweisungen von CPAN Seite über die Installation, dass wir libxml2, iconv und zlib Wrapper installieren müssen, bevor XML::LibXML Installation und es hat nicht funktioniert.

Auch wenn es eine andere einfachere Modul ist, dass meine Aufgabe mich getan wird, lassen Sie es wissen.

Die Aufgabe auf der Hand:

Ich bin auf der Suche nach einem bestimmten <dd>-Tag auf einer HTML-Seite, die wirklich groß ist (etwa 5.000-10.000) <dd> und <dt> Tags. Also, ich bin ein Skript zu schreiben, die den Inhalt innerhalb <dd> Tag übereinstimmt und holt den Inhalt innerhalb des entsprechenden (nächsten) <dt> Tag.

Ich wünschte, ich könnte ich ein wenig klarer mehr gewesen sein. Jede Hilfe wird sehr geschätzt.

War es hilfreich?

Lösung

Wenn Sie Activestate Perl verwenden, sollten Sie die Repositories unter ActivePerl 10xx Win32 PPM-Pakete ppm und dann Verwendung

ppm install XML::LibXML

Der Versuch, Parsen von HTML als XML ist in der Regel keine angenehme Aufgabe. Ich denke, HTML :: TokeParser , um die Aufgabe besser geeignet ist.

#!/usr/bin/perl

use strict;
use warnings;

use HTML::TokeParser;

my $p = HTML::TokeParser->new(\*DATA);

my @definitions;

while ( my $dl_tag = $p->get_tag('dl') ) {
    while ( my $dt_tag = $p->get_tag('dt') ) {
        my $term = $p->get_trimmed_text('/dt');
        my $dd_tag = $p->get_tag('dd');
        my $defn = $p->get_trimmed_text('/dd');
        push @definitions, [$term, $defn];
    }
}

use Data::Dumper;
print Dumper \@definitions;

__DATA__
<dl>
<dt>One</dt>
<dd>1</dd>
<dt>Two</dt>
<dd>2</dd>
</dl>

Ausgabe:

$VAR1 = [
          [
            'One',
            '1'
          ],
          [
            'Two',
            '2'
          ]
        ];

Andere Tipps

Wenn Sie nur XPath wollen fragt dann schrieb ich nur ein Skript gestern, dass Anwendungen XML :: XPath :: XMLParser XPath-Abfragen auf einer XML-Datei zu tun.

Ich habe es mit beiden Active Perl-Installation getestet und mit Erdbeer-Perl unter Windows.

Ich erinnere mich noch keine Module zu installieren, um cpan zu gehen (obwohl ich früher haben kann und vergaß dabei :)), so vielleicht können Sie die XML verwenden :: XPath-Modul statt?

Hier ist die Probe aus der Dokumentation

use XML::XPath;
use XML::XPath::XMLParser;

my $xp = XML::XPath->new(filename => 'test.xhtml');

my $nodeset = $xp->find('/html/body/p'); # find all paragraphs

foreach my $node ($nodeset->get_nodelist) {
    print "FOUND\n\n", 
        XML::XPath::XMLParser::as_string($node),
        "\n\n";
}

Unter der Annahme, dass Sie Activestate Perl verwenden, können Sie get XML :: LibXML funktioniert ganz gut. Sie können XML :: LibXML von Randy Kobes' site und Sie erhalten libxslt / libxml erhalten usw. von zlatkovic.com

Ich installiere gerade noch libxml und dann ppm verwenden, um XML :: LibXML zu installieren. Funktioniert gut.

Wenn Sie mit Strawberry Perl , CPAN sollte für Sie libxml2 arbeiten, usw. sind Teil der Erdbeere Perl-Distribution, glaube ich.

Auch meinen Beitrag im Thread siehe Wie installiere ich XML :: LibXML für ActivePerl? .

bespricht einige Probleme / Lösungen, die ich gestoßen Installation XML-LibXML PPM verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top