2010-12-01 18 views
0

J'ai un gros document - je dois l'analyser et de cracher seulement cette partie: schule.php schulnr = 80287 & lschb =l'analyse d'un grand fichier html (local) - avec Perl ou PHP

comment? est-ce que j'analyse les choses?

<td> 
    <A HREF="schule.php?schulnr=80287&lschb=" target="_blank"> 
     <center><img border=0 height=16 width=15 src="sh_info.gif"></center> 
    </A> 
</td> 

aime entendre de vous

+3

Utilisez une expression régulière et inclinez-vous devant le Seigneur des Ténèbres. http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html – Stephen

+0

J'étais sur le point de dire "quel genre de dolt publie un billet de blog sur la façon de faire cette mauvaise chose ...alors j'ai remarqué que c'était Coding Horror :) [pour le non-initié, propriétaire du blog Coding Horror est l'un des 2 co-fondateurs de StackOverflow et certainement un meilleur programmeur que moi :)] – DVK

Répondre

3

Vous pouvez aussi le faire de cette façon (il est perl mais plus "visuel"):

  • Chargez le document dans votre navigateur, si possible
  • Installer l'extension Firebug/add-on
  • Installez l FirePath l'extension
  • Copier + Coller cette expression XPath dans le champ texte intitulé "XPpath:"

    // un [contient (@href, "Schule")]/@ href

  • Cliquez "Eval" bouton.

Il existe également des outils pour ce faire sur la ligne de commande, par ex. "xmllint" (pour unix)

xmllint --html --xpath '//a[contains(@href, "schule")]/@href' myfile.php.or.html 

Vous pouvez effectuer un traitement supplémentaire à partir de là.

5

Vous devez utiliser un analyseur DOM comme PHP Simple HTML DOM Parser

// Create DOM from URL or file 
$html = file_get_html('http://www.google.com/'); 

// Find all links 
foreach($html->find('a') as $element) 
     echo $element->href . '<br>'; 
+0

Salut Rfygyhn - merci beaucoup. Je le ferai! Je reviens et vous laisse savoir ce que j'ai vécu. meilleures salutations – zero

5

En Perl, le plus rapide et le meilleur, je sais que pour scanner HTML est HTML::PullParser. Ceci est basé sur un analyseur HTML robuste, pas un simple FSA comme Perl regex (sans récursion).

Cela ressemble plus à un filtre SAX qu'à un DOM.

use 5.010; 
use constant NOT_FOUND => -1; 
use strict; 
use warnings; 

use English qw<$OS_ERROR>; 
use HTML::PullParser(); 

my $pp 
    = HTML::PullParser->new(
     # your file or even a handle 
     file  => 'my.html' 
     # specifies that you want a tuple of tagname, attribute hash 
    , start  => 'tag, attr' 
     # you only want to look at tags with tagname = 'a' 
    , report_tags => [ 'a' ], 
    ) 
    or die "$OS_ERROR" 
    ; 

my $anchor_url; 
while (defined(my $t = $pp->get_token)) { 
    next unless ref $t or $t->[0] ne 'a'; # this shouldn't happen, really 
    my $href = $t->[1]->{href}; 
    if (index($href, 'schule.php?') > NOT_FOUND) { 
     $anchor_url = $href; 
     last; 
    } 
} 
4

Qu'ont dit Rfvgyhn, mais la saveur Perl depuis qui était l'une des balises: utilisez HTML::TreeBuilder

De plus, pour des raisons pour lesquelles RegEx est presque jamais une bonne idée pour analyser XML/HTML (parfois, il est assez bon avec le major Mises en garde), lisez le post StackOverflow obligatoire et tristement célèbre:

RegEx match open tags except XHTML self-contained tags

Rappelez-vous, si l'étendue de votre tâche est littéralement "analyser les liens HREF", ET vous n'avez pas "< lien>" tags ET les liens (par ex. HREF="something" sous-titres) sont garantis ne pas être utilisés dans d'autres contextes (par exemple, dans les commentaires, ou en texte, ou ont "HREF =" faire partie du lien lui-même), il peut tomber dans la catégorie "Good Enough" utilisation:

my @lines = <>; # Replace with proper method of reading in your file 
my @hrefs = map { $_ =~ /href="([^"]+)"/gi; } @lines;