Perl WWW :: Mechanize - analyse du code HTML dans un rapport de base

J'ai un script qui télécharge une page Web, puis analyse cela jusqu'à une liste d'URL comme celle-ci

26165
29327
29416
29450

Je les dépouille ensuite et charge les URL du ticket dans le tableau @url_list et en extrait ensuite des informations

#!/usr/bin/perl 
use WWW::Mechanize;
use LWP;

my $username = 'casper';
my $password = 'casper';

my $mech = WWW::Mechanize->new();
$mech->cookie_jar(HTTP::Cookies->new());
$mech->get('http://ticketmaster/wonk.dll?ReportPage&Template=reports%2Flist&TableId=1023&Target=Query&QueryName=-6&SolutionId=8') || die "can't reach the website $!";
$mech->form_name('theform');
$mech->field('ttAuthUID' => $username);
$mech->field('ttAuthPWD' => $password);
$mech->click('Action');

print $mech->save_content(raw_teamtrack);

open(my $webpage, "<", "raw_teamtrack") || die "cannot open up the out file $!";

while (<$webpage>) {
  chomp;
  $link = $_;
  if ($link =~ /new();
  $mech->cookie_jar(HTTP::Cookies->new());
  $mech->get("http://ticketmaster/$url")
      || die "cannot load the ticket page $!";
  $mech->form_name('theform');
  $mech->field('ttAuthUID' => $username);
  $mech->field('ttAuthPWD' => $password);
  $mech->click('Action');
  print $mech->save_content(raw_ticket);
  open(my $ticketpage, "<", "raw_ticket")
      || die "cannot open up the out file $!";

  while (<$ticketpage>) {
    chomp;
    if (/Item\sId:\s+?<\/B>(\d{5})/) { $Item_number = $1; } elsif (/Owner:\s<\/B>(.*)
/) { $Owner = $1; } else { $ticket_title =~ /Title:\s<\/B>(.*)/; print "$Item_number $Owner $ticket_title\n"; sleep 1; } } }

Le problème est qu'il n'imprime que les champs Numéro d'article et Propriétaire. il n'imprime pas le titre du ticket.

En outre, il imprime les informations une fois pour chaque itération - pour chaque ligne HTML du ticket qu'il télécharge.

Cela m'arrive tout le temps: je dois généralement sortir la boucle de la parenthèse. Cela résout, mais d'un point de vue fondamental, je ne comprends pas pourquoi le déplacer à l'extérieur de la boucle le fixe. Pourquoi imprimer pour chaque ligne de HTML où il est maintenant?

Je ne comprends pas non plus pourquoi $ owner n'est pas imprimé. Y at-il quelque chose qui se passe avec le else ? Dois-je utiliser une autre instruction if ?

26165   George Glass
26165   George Glass
26165   George Glass
26165   George Glass
26165   George Glass
26165   George Glass
26165   George Glass
26165   George Glass
29327   George Glass
29327   Jimmy Jack
29450   Jimmy Jack
29450   Jimmy Jack
29450   Jimmy Jack
29450   Jimmy Jack
29450   Jimmy Jack
29450   Jimmy Jack
29450   Jimmy Jack
29450   Jimmy Jack
29450   Jimmy Jack
29753   Herley Lee
29753   Herley Lee  
29753   Herley Lee
29753   Herley Lee
29753   Herley Lee
29753   Herley Lee
29753   Herley Lee
29753   Herley Lee

les regex sont bons.

bash-3.00$ cat /tmp/raw_ticket | perl -nle 'print /Item\sId:\s+?<\/B>(\d{5})/' | sort -u
29871

 bash-3.00$ cat /tmp/raw_ticket | perl -nle 'print /Owner:\s<\/B>(.*)
/' | sort -u Jimmy Jack bash-3.00$ bash-3.00$ cat /tmp/raw_ticket | perl -nle 'print /Title:\s<\/B>(.*)/' | sort -u Trade Capture Prod Shadow - Install software on ushs2 - 11/15/13 bash-3.00$

Je ne pouvais pas ajouter le code HTML que je suis en train de décomposer ici car il s'agit de HTML et ne formatait pas s'il vous plaît vérifier ce pastebucket .

0
@Borodin - hé - merci d'avoir regardé cela - j'ai pris ThisSuitIsBlackNot suggestion et mettre un peu plus de temps à trouver ce qui ne va pas avec le bas foreachloop. Je l'ai pris hors de la boucle while. Ouais - à propos de la réplication du code - j'ai eu du mal à le faire fonctionner et j'ai fini par répliquer tout le code. Je vais sélectivement enlever les choses et continuer à les gérer. Je suis autodidacte et vous pouvez certainement voir les trous dans mon apprentissage.
ajouté l'auteur capser, source
@Borodin - Si vous voulez vous asseoir dans votre tour d'ivoire et prendre des coups de pot à mes scripts - bien. Mais si vous aimez la langue Perl autant que moi, vous devriez comprendre quelque chose. Vous pouvez vous plaindre de gens comme moi tout ce que vous voulez, mais je suis le gars qui garde cette langue en vie - pas vous. Parce que je travaille pour vivre et que je travaille avec Perl, je le garde viable et vivant. Vous êtes un expert, mais votre attitude envers les nouveaux adhérents les conduit vers des langages plus sympathiques comme Python. Continuez Borodin et un jour tout le
ajouté l'auteur capser, source
@Borodin - Pour garder la langue vivante - je travaille à Wall Street, je ne suis pas un scientifique, mais je suis formé pour comprendre les tendances. Les initiés les plus jeunes ne veulent rien avoir à faire avec Perl. Python est facile et ils ne sont pas flambés lorsqu'ils posent une question python en ligne. En ce qui concerne mon organisation, je travaille pour garder cette boutique Perl. Je garde Perl en vie. Mais en tant qu'expert, en déchirant les gens qui ne sont pas à votre niveau dans les forums - vous ne contribuez pas à maintenir Perl en vie, vous chassez les gens. Si les débutan
ajouté l'auteur capser, source
J'ai rangé votre code Perl pour qu'il soit plus lisible, mais ajoutez use strict et utilisez les avertissements au début de votre programme et corrigez les erreurs que vous avez à partir de ce. Il n'est pas juste de demander de l'aide aux autres si vous n'avez pas utilisé les outils de base fournis par Perl.
ajouté l'auteur Borodin, source
Vous avez répliqué une grande partie de votre code dans la boucle for , y compris les instructions use et la configuration de vos variables de nom d'utilisateur et de mot de passe. Il devrait être clair que cela n'a pas besoin d'être fait plus d'une fois, et votre approche ressemble plus à des conjectures qu'à une pensée claire.
ajouté l'auteur Borodin, source
Les données que vous avez publiées sur pastebucket sont-elles le contenu de raw_teamtrack ?
ajouté l'auteur Borodin, source
J'ai dû voter pour clore votre question. Si vous ne pouvez pas fournir un programme que nous pouvons exécuter et voir le problème que vous voyez alors nous ne pouvons pas vraiment aider.
ajouté l'auteur Borodin, source
Vous ne devriez vraiment pas demander de l'aide pour corriger ce code. Vous l'avez assemblé à partir de suppositions, et ce n'est jamais la bonne façon de mettre un programme ensemble. Vous devriez être capable d'expliquer le comportement et le but de chaque ligne, et finalement de chaque caractère, dans votre code. Vous ne pouvez pas simplement ajouter des bits et le pousser jusqu'à ce que ce soit juste, comme si c'était Play-Doh.
ajouté l'auteur Borodin, source
@ BradGilbert: Merci pour votre commentaire. Oui, quand vous essayez de comprendre la bête, vous pouvez la piquer et voir ce qu'elle crache. Mais cela ne devrait pas être la condition du code pour lequel vous demandez de l'aide. Vous devriez déjà avoir un tas de spew qui vous mènera à une solution jugée qui ne fonctionne pas vraiment. Vous devriez mal comprendre un appel à la boîte noire, ou oublier des considérations de synchronisation dans un contexte parallèle, ou ... etc. Mais ne pas comprendre mal la langue que vous utilisez pour programmer.
ajouté l'auteur Borodin, source
J'espérais que mes commentaires seraient considérés comme des incitatifs pour améliorer tous vos programmes. Je doute fort que vous gardiez Perl en vie, car il ne semble pas que vous ayez le coup du tout. Je suis sûr que votre plus grande erreur est que vous vous contentez d'écrire beaucoup trop de code avant de commencer le débogage. Six ou huit lignes de Perl suffisent à vous assurer que votre programme de vestigial fonctionne. C'est pourquoi il est tellement plus facile d'écrire un logiciel à partir de zéro que de maintenir un code existant: il faut absorber et comprendre à peu près tou
ajouté l'auteur Borodin, source
Sans voir l'entrée exacte que vous traitez, il est difficile d'aider. Dans votre dernier bloc de code, vous avez testé vos regex en utilisant un fichier; s'il vous plaît poster le contenu de ce fichier au lieu d'un tas de code WWW :: Mechanize qui n'est probablement pas lié à votre vrai problème. Si vous créez un exemple simple et autonome, il sera beaucoup plus facile de déboguer et vous obtiendrez probablement une réponse plus rapidement (si vous ne la trouvez pas vous-même dans le processus).
ajouté l'auteur ThisSuitIsBlackNot, source
@Borodin Vous dites de ne pas " ajouter des bits et de pousser jusqu'à ce que ce soit juste ", mais c'est exactement comme cela que j'ai appris à programmer. Bien sûr, maintenant je n'ai généralement pas à faire ça. (Je travaille de cette façon en essayant de traiter des fichiers ad-hoc, car il est presque impossible de l'écrire autrement.) Je pense que votre opinion était un peu dure, même si je suis d'accord dans une certaine mesure. Il est assez difficile de connaître la bonne façon de programmer, si vous ne connaissez même pas la mauvaise façon de le faire.
ajouté l'auteur Brad Gilbert, source

1 Réponses

Je suppose que c'est la façon dont vous êtes en train de faire correspondre les instructions if et en assignant une variable $ 1 (la dernière regex check/assign dans votre code est fausse). Les travaux suivants sur les données de test pour un exemple (de sorte que le titre du billet sera au moins imprimé, pas sûr de la boucle sans un ensemble d'URL).

Donc, je voudrais correspondre comme ça ...

use strict;
use warnings; # always use these at top

....

my $Item_number;
my $Owner;
my $ticket_title;

while (<$webpage>) {
    my $line = $_;
    chomp;
    $line =~ /Item\sId:\s+?<\/B>(\d{5})/ and $Item_number = $1;
    $line =~ /Owner:\s<\/B>(.*)
/ and $Owner = $1; $line =~ /Title:\s<\/B>(.*)/ and $ticket_title = $1; } print "$Item_number $Owner $ticket_title\n";

Il y a beaucoup d'autres problèmes dans le code, mais j'essaie juste d'isoler là où je soupçonne que le problème est. Lorsque vous ne faites qu'une seule regex à tester, cela fonctionnera bien, donc l'expression régulière est ok dans l'isolement. C'est quand vous combinez plusieurs regexes l'une après l'autre est inconsistant.

Juste pour clarifier la façon dont cela fonctionne, le 'et' est comme un raccourci, donc l'assignation n'est exécutée que si la regex est vraie dans ce cas.

0
ajouté
Hey - merci c'était vraiment ce que je cherchais - suggestion sur une meilleure forme.
ajouté l'auteur capser, source