2010-10-16 18 views
1

Un travail triple: je dois faire un travail avec une tâche arborescente. Nous avons trois tâches:fetch pages [LWP] les analyse [HTML :: TokeParser] et stocke les résultats [DBI]

  1. pages Fetch
  2. Parse HTML
  3. données de magasin ... Et oui - c'est un vrai Perl-travail!

Je dois faire un travail d'analyseur sur toutes les 6000 sous-pages d'un site en suisse. (un site gouvernemental - qui a de très bons serveurs).

voir http://www.educa.ch/dyn/79362.asp?action=search et
(si vous ne voyez pas environ 6000 résultats - puis effectuez une recherche avec

Une page détaillée est comme ceci:.

[texte du lien] [1]

  • Nouvelle école de la Suisse Romande Ch. de Rovéréaz 20 Case postale 161 1000 Lausanne 12 Site [email protected] Tél: 021 654 65 00 Fax: 021 654 65 05

autres pages détaillées montre ceci:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta name="generator" content="DigiOnline GmbH - WebWeaver 3.4 CMS - "><title>educa.ch</title><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"><link rel="stylesheet" href="101.htm"><script src="102.htm"></script><script language="JavaScript"><!-- 
var did='d79376'; 
var root=new Array('d200','d205','d73137','d1566','d79376','d'); 
var usefocus = 1; 
function check() { 
if ((self.focus) && (usefocus)) { 
self.focus(); 
} 
} 
// --></script></head><body bgcolor="#FFFFFF" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" onload="check();"><table cellspacing="0" cellpadding="0" border="0" width="100%"><tr><td width="15" class="popuphead"><img src="/0.gif" alt="" width="15" height="16"></td><td width="99%" class="popuphead">Adresse - Schulen in der Schweiz</td><td width="20" class="popuphead" valign="middle"><a href="#" title="Print" onclick="window.print(); return false;"><img src="../pics/print16x13.gif" alt="Drucken" width="16" height="13"></a></td><td width="20" class="popuphead" valign="middle"><a href="#" title="close" onclick="window.close(); return false;"><img src="../pics/close21x13.gif" alt="Schliessen" width="21" height="13"></a></td></tr><tr bgcolor="#B2B2B2"><td colspan="4"><img src="/0.gif" alt="" width="1" height="1"></td></tr></table><div class="leerzeile">&#160;</div><div class="leerzeile"><img src="/0.gif" alt="" width="15" height="8">Auseklis - Schule für lettische Sprache und Kultur</div><div class="leerzeile">&#160;</div><div><img src="/0.gif" alt="" width="15" height="8">Mutschellenstrasse 37</div><div><img src="/0.gif" alt="" width="15" height="8"></div><div><img src="/0.gif" alt="" width="15" height="8">8002&#160;Zürich</div><div class="leerzeile">&#160;</div><div><img src="/0.gif" alt="" width="15" height="8"><a href="http://latvia.yourworld.ch" target="_blank">latvia.yourworld.ch</a></div><div><img src="/0.gif" alt="" width="15" height="8"><a href="mailto: [email protected]">[email protected]</a></div><div class="leerzeile">&#160;</div><div><img src="/0.gif" alt="" width="15" height="8">Tel:<img src="/0.gif" alt="" width="6" height="8">+41786488637</div><div><img src="/0.gif" alt="" width="15" height="8">Fax:<img src="/0.gif" alt="" width="4" height="8"></div><div>&#160;</div></body></html> 

I veulent faire ce travail avec HTML :: ** TokeParser ou HTML :: TokeParser ** ou * HTML :: TreeBuilder :: LibXML * mais j'ai peu d'expérience avec HTML :: TreeBuilder :: LibXML

Lequel Préférez-vous f ou ce travail: Note - Je veux stocker les résultats dans une base de données MySQL. Les meilleures choses serait de stocker immitiately après l'analyse syntaxique:

Nous avons donc trois tâches:

  1. Fetch pages
  2. Parse HTML
  3. Stocker les données

Premier élément : Utilisez LWP :: UserAgent pour récupérer. Il existe de nombreux exemples dans ce forum d'utilisation de ce module pour publier des données et obtenir les pages résultantes. BTW nous pouvons utiliser Mechanize à la place si nous préférons.

Deuxième: Analyser la page comme par exemple avec HTML :: TokeParser ou un autre module pour obtenir uniquement les données dont nous avons besoin.

Troisième: Stockez les données directement dans une base de données. Il n'est pas nécessaire de passer par une étape intermédiaire et d'écrire un fichier temporaire.

hmmm - la première et la deuxième question - comment chercher et comment analyser.

Répondre

2

Difficile d'être trop précis car votre question est très générale. J'ai récupéré des pages en utilisant LWP et utilisé TokeParser pour extraire des données et stocker la sortie dans une base de données plusieurs fois. Je n'ai pas utilisé Mech, mais selon tous les comptes, c'est plus simple que LWP.

Création d'un agent utilisateur à l'aide LWP peut être aussi simple que:

my $ua = LWP::UserAgent->new(); 

vous devez considérer les choses comme réoriente, les procurations et les cookies ou les mots de passe en fonction de vos besoins.

Pour suivre réoriente:

$ua = LWP::UserAgent->new(
    requests_redirectable => ['GET', 'HEAD', 'POST' ] 
); 

Pour stocker les cookies:

$ua->cookie_jar({}); 

Pour configurer un proxy:

$ua->proxy("http", "http://localhost:8888"); # Fiddler 

Pour ajouter un mot de passe pour l'authentification:

$ua->credentials('www.myhostingplace.com:443' , 'Realm' , 'userid', 'password'); 

Pour obtenir le contenu d'une page pour le traitement local:

$url = 'http://www.someurl.com' 
my $response = $ua->get($url); 
if ($response->is_error()) { 
    # Do some error stuff 
} 
my $content = $response->content(); 

Pour analyser le contenu en utilisant TokeParser:

my $stream = new HTML::TokeParser(\$content); 

while (my $t = $stream->get_token()) { 
    if ($t->[0] eq 'S' and $t->[1] eq 'input') { 
     if (uc($t->[2]{ 'name' }) eq 'SEARCHVALUE') { 
      my $data = $t->[2]{ 'value' }; 
      # Do something with data 
     } 
    } 
} 

Les données sont transmises en TokeParser comme référence; Je marche ensuite à travers le flux en utilisant get token. Chaque élément HTML est transmis dans un tableau que vous pouvez examiner pour déterminer ce que vous devez faire ensuite.

Dans l'exemple ci-dessus, je souhaite rechercher des balises d'entrée avec un nom d'attribut 'SEARCHVALUE', puis stocker l'attribut 'value'. Le fragment HTML pourrait ressembler à ceci:

<input type="hidden" name="SEARCHVALUE" value="Spock" /> 

Quand je frappe le début de la balise d'entrée (t $ -> [0] eq 'S' et t $ - 'entrée' eq> [1]) J'examine l'attribut "name" du tag (t -> [2] {'name'}) pour voir s'il correspond à la valeur que je recherche; si c'est le cas, je stocke l'attribut value de la balise ($ t -> [2] {'value'}) dans une variable. Je peux alors faire ce que j'aime avec la valeur y compris le stocker dans une base de données.

Vous pouvez faire beaucoup avec TokeParser et, dans certains cas, il peut être plus simple que d'utiliser des expressions régulières pour découper la page, mais cela peut aussi être un peu difficile de comprendre. Si vous essayez d'extraire un motif simple à partir du contenu HTML de retour, une expression régulière peut être tout aussi bonne.

Si vous avez beaucoup de choses à faire, alors je recommande "Perl et LWP" par Sean Burke d'O'Reilly. Il a été infiniment utile pour moi dans mes efforts de raclage web.

Espérons que cela vous aide à démarrer au moins.

+0

Bonjour Auctionitis, Un grand merci pour la réponse. Cela m'aide à commencer. Et oui: j'ai déjà commandé le livre "Perl and LWP" de Sean Burke. Un bon tipp! Remarque - j'ai beaucoup de choses à faire. - Je viendrai avec plus de questions et d'autres choses - mais maintenant je vais d'abord faire quelques exercices. Jusqu'à bientôt! Cordialement – zero

+0

Bonjour Auctionitis - encore merci pour le message et vos bons conseils. BTW - J'ai fait plus d'efforts - pouvez-vous m'aider à déboguer.Aime avoir de vos nouvelles - voir le code pour déboguer! http://stackoverflow.com/questions/4007480/applying-a-loop-on-lwpuseragent-to-fetch-1000-pages-at-once - j'adore avoir de vos nouvelles. Martin – zero