Jemand zu Hause?Leser: 17
URI) z.B. alphabetisch sortiert, das die Reihenfolge dann bei mehreren Hyperlinks gleich ist. Ich will den URI string nämlich gerne als eindeutige ID haben.1 2 3 4 5 6 7 8
use URI::Split qw(uri_split); my $uri = 'http://example.net/?foo=bar&baz=fu'; my ($scheme, $auth, $path, $query, $frag) = uri_split($uri); my @sorted_query = sort split /&/, $query; $query = join '&', @sorted_query; my $new_uri_string = $scheme . $auth . $path . $query . $frag;
2020-01-28T14:59:17 styx-ccDen Querystring kannst du doch per Hand splitten.
CGI erzeugt.
URI::Escape) schicken. 1 2
$q = CGI->new( 'foo=1;bar=2;bar=3;bar=4' ); $q = CGI->new( 'foo=1&bar=2&bar=3&bar=4' );
CGI kann das und behandelt auch absurde Randfälle. Ich hatte nicht drangedacht, dass man ein CGI-Objekt auch mit einem rohen Querystring erzeugen kann. Das ist dann sicher eine sehr verlässliche Methode.
WWW::Form::UrlEncoded gefunden, das macht ziemlich genau das, was hier passend ist, und liefert auch gleich eine Liste von verqueren Query-Strings und wie es drauf reagiert.
2020-01-28T13:01:49 mikaPS: Ich habe auch Hyperlinks mit unterschiedlicher Query, die aber die gleiche Seite ausliefern (zumindest Augenscheinlich). Solche Dopplungen zu erkennen, wäre schön ist aber glaube ich einfach nicht richtig, weil so Information verlorengehen dann, wenn die erste Annahme falsch ist.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
# application/x-www-form-urlencoded sub qparse{ my $rawdata = shift; # querystring my %param = (); my @pie = split /[;&]/, $rawdata; foreach my $p(@pie){ my ($pname, $val) = split(/=/, $p, 2); next unless $pname; next unless defined $val; $val =~ s/\+/ /g; $val =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg; push @{$param{$pname}}, $val; # key => [val,val..] } return \%param; }
Canonical_Link. In Deinem Beispiel steht da:<link rel="canonical" href="https://www.stern.de/panorama/drei-weitere-coronavirus-faelle-in-bayern-bestaetigt-9111748.html"/>
Link: <https://rolfrost.de/>; rel="canonical"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/perl
use strict;
use warnings;
use LWP;
use Data::Dumper;
my $browser = LWP::UserAgent->new();
my $site = $browser->get('http://de.wikibooks.org');
my $code = $site->decoded_content();
use XML::LibXML;
my $dom = XML::LibXML->load_xml(string => $code);
foreach my $node ($dom->findnodes('//link[@rel="canonical"]/@href')) {
print $node->to_literal(), " # canonical LibXML\n";
}
use XML::XPath;
my $xp = XML::XPath->new(xml => $code);
foreach my $node ($xp->findnodes('//link[@rel="canonical"]')) {
print $node->getAttribute('href'), " # canonical XPath\n";
}
1 2 3
use Web::Query::LibXML 'wq'; print wq('http://de.wikibooks.org')->find('link[rel="canonical"]')->attr('href'); # https://de.wikibooks.org/wiki/Hauptseite
1
2
3
4
5
my $dom = XML::LibXML->load_html(
string => $code,
recover => 1, # try to recover parse errors and carry on to produce a DOM
suppress_errors => 1, # turn off the error output
);
2020-02-10T05:45:43 rostiDen Link-Header abzufragen ist deutlich einfacher als HTML zu parsen.
Tipp zum Debugging