2 Stimmen

Wie man mithilfe von LWP und einem Regex das Datum-Argument zu einer JavaScript-Funktion abruft?

Ich habe Schwierigkeiten, Daten von einer bestimmten Webseite abzurufen, weil das Datum anscheinend ein Argument ist, das an eine Javascript-Funktion übergeben wird. In der Vergangenheit habe ich einige einfache Scraper geschrieben, ohne größere Probleme, daher habe ich keine Probleme erwartet, aber ich habe Schwierigkeiten damit. Die Seite hat 5-6 Daten im regulären JJJJ/MM/TT-Format wie dieses dateFormat('2012/02/07')

Am liebsten würde ich alles außer den halben Dutzend Daten entfernen, die ich in einem Array speichern möchte. Zu diesem Zeitpunkt kann ich nicht einmal erfolgreich ein Datum abrufen, geschweige denn alle. Es handelt sich wahrscheinlich nur um einen fehlerhaften regulären Ausdruck, den ich bereits so lange ansehe, dass ich keinen mehr erkenne.

Q1. Warum erhalte ich keine Übereinstimmung mit dem unten stehenden regulären Ausdruck?

Q2. Im Anschluss an die obige Frage, wie kann ich alle Daten in ein Array abrufen? Ich dachte daran, anzunehmen, dass es x Anzahl von Daten auf der Seite gibt, x Mal durch eine Schleife zu iterieren und in jeder Schleife die erfasste Gruppe einem Array zuzuweisen, aber das erscheint recht umständlich.

Im Folgenden folgt der Problemcode.

#!/usr/bin/perl -w
use strict;
use LWP::Simple;
use HTML::Tree;

my $url_full = "http://www.tse.or.jp/english/market/STATISTICS/e06_past.html";
my $content = get($url_full);
#dateFormat('2012/02/07');
$content =~ s/.*dateFormat\('(\d{4}\/\d{2}\/\d{2}\s{2})'\);.*/$1/; # erhalte jedes Datum, ohne auf Gier etc. zu achten

3voto

stema Punkte 85725

Warum hast du zwei Leerzeichen in deinem Muster?

$content =~ s/.*dateFormat\('(\d{4}\/\d{2}\/\d{2}\s{2})'\);.*/$1/;
                                                 ^^^^^

Sie sind nicht in Ihrem Formatbeispiel 'dateFormat('2012/02/07')'

Ich würde sagen, das ist der Grund, warum Ihr Muster nicht übereinstimmt.

Alle Daten erfassen

Sie können einfach alle Treffer in ein Array wie folgt erhalten

( my @Result ) = $content =~ /(?<=dateFormat\(')\d{4}\/\d{2}\/\d{2}(?='\))/g;

(?<=dateFormat\(') ist eine positive Rückwärtsansicht, die sicherstellt, dass vor Ihrem Datumsformatmuster dateFormat\(' steht (aber das ist nicht in Ihrem Treffer enthalten)

(?='\)) ist eine positive Vorwärtsansicht, die sicherstellt, dass nach dem Muster '\) steht

Der g Modifier ermöglicht es Ihrem Muster, nach allen Treffern in der Zeichenkette zu suchen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X