2010-05-21 7 views
3

J'ai du contenu HTML stocké dans une variable. Comment puis-je extraire des données trouvées entre un ensemble de balises communes dans la page? Par exemple, je suis intéressé par les données (représentés par DATA maintenue entre un ensemble de balises qui une ligne après l'autre:Grep et extraire des données en Perl

... 
<td class="jumlah">*DATA_1*</td> 
<td class="ud"><a href="">*DATA_2*</a></td> 
... 

Et puis je voudrais enregistrer un mappage données_2 => DATA_1 dans un hachage

Répondre

0

Comme il s'agit de HTML, vous voulez probablement que le module XPath soit conçu pour fonctionner avec HTML, HTML::TreeBuilder::XPath.

D'abord, vous devrez analyser votre chaîne en utilisant les méthodes HTML :: TreeBuilder. En supposant que le contenu de votre page Web est une variable nommée $content, faites comme ceci:

my $tree = HTML::TreeBuilder->new; 
$tree->parse_file($file_name); 

Maintenant, vous pouvez utiliser des expressions XPath pour obtenir itérateurs sur les nœuds qui vous passionnent. Cette première expression obtient tous les td nœuds qui sont en tr dans un table dans le body dans l'élément html:

my $tdNodes = $tree->findnodes('/html/body/table/tr/td'); 

Enfin, vous pouvez simplement itérer sur tous les noeuds dans une boucle pour trouver ce que vous voulez:

foreach my $node ($tdNodes->get_nodelist) { 
    my $data = $node->findvalue('.'); // the content of the node 
    print "$data\n"; 
} 

Voir la documentation HTML::TreeBuilder pour plus sur ses méthodes et la documentation NodeSet pour savoir comment utiliser l'objet de résultat NodeSet. w3schools a un didacticiel XPath passable here. Avec tout cela, vous devriez être en mesure d'effectuer une analyse HTML assez robuste pour récupérer tout élément que vous voulez. Vous pouvez même spécifier des classes, des identifiants et plus dans vos requêtes XPath pour être vraiment précis sur les nœuds que vous voulez. À mon avis, l'analyse du code HTML à l'aide de cette bibliothèque XPath modifiée est beaucoup plus rapide et plus facile à gérer que la gestion d'une série de regex uniques.

+0

+1 pour avoir un exemple de code. –

2

Comme il est HTML Je pense que cela pourrait fonctionner pour vous?

https://metacpan.org/pod/XML::XPath

XPath est le chemin.

+1

XPATH n'est-il pas limité à XML (et donc uniquement à XHTML)?J'ai très peu d'expérience avec ça, mais je ne l'ai jamais vu manipuler des non-X HTML – DVK

+0

@DVK: Je ne mettrais pas un module XPath développé en Perl pour essayer d'être un peu plus intelligent. – Axeman

+0

@Axeman - touche :) – DVK

0

Utiliser les modules d'analyse HTML comme décrit dans les réponses to this Q - HTML :: TreeBuilder ou HTML :: Parser. En théorie, vous pouvez le faire en utilisant Regular Expressions, mais comme indiqué dans les réponses à la question liée et d'innombrables fois sur SO, analyser HTML avec RegEx est une mauvaise idée avec des lettres majuscules - trop facile de se tromper, trop difficile à obtenir, et impossible d'obtenir 100% raison puisque HTML n'est pas une langue régulière.

+0

Il pourrait être théoriquement impossible - HTML n'est pas une langue régulière. Si sa requête est "régulière", ce serait possible. –

0

Vous pouvez essayer ce module: HTML::TreeBuilder::XPath. Le document dit:

Ce module ajoute des méthodes XPath typiques à HTML :: TreeBuilder, pour faciliter l'interrogation d'un document.

Questions connexes