Vyhledání hypertextových odkazů

antaresin

Vyhledání hypertextových odkazů
« kdy: 07. 05. 2011, 19:33:52 »
Zdravím všechny.

Potřeboval bych pomoci. Mám několik html dokumentů ("zdrojové kody int. stránek") a potřebuji z nich vytáhnout všechny hypertextové odkazy.

Můžete mi pomoci jak na to? Napadlo mě třeba nějákým skriptem a přes sed,awk...nebo možná je nějáký online analyzátor, který to z toho vytáhne...nevím:(

ideální by bylo, kdyby to oštřilo i duplicity, ale to není až tak nutné...Velmi děkuji za pomoc!


martin

Re: Vyhledání hypertextových odkazů
« Odpověď #1 kdy: 08. 05. 2011, 00:47:33 »
To lze udělat několika způsoby. Např. pomocí hpricot knihovny v ruby:

% ruby -r rubygems -e 'require "hpricot"; doc=Hpricot(STDIN); doc.search("a|img") do |e|  case e.name; when "a" : p e[:href] ; when "img" : p e[:src] ; end ; end;' < index.html

Vrací jak href, tak src pro img (to jen tak pro ukázku univerzálnosti). Unikáty můžete získat buď pomocí sort(1) a uniq(1) a nebo přímo v ruby tak, že URI dáte do pole a uděláte to samé .sort.uniq

 

naiive

Re: Vyhledání hypertextových odkazů
« Odpověď #2 kdy: 08. 05. 2011, 02:01:03 »
cat stranky*.html | ./url_finder.pl

kde url_finder.pl:
Kód: [Vybrat]
#!/usr/bin/env perl

use strict;
use warnings;

my %URLS;

while(my $line = <STDIN>) {
while($line =~ m/((http|https|ftp):\/\/([a-zA-Z0-9\-\.])+(\.)([a-zA-Z0-9]){2,4}([a-zA-Z0-9\/+=%&_\.~?\-]*)*)/g) {
$URLS{$1} = ();
}
};

print join "\n", keys(%URLS);
print "\n";

osetruje aj duplicity... ale pre prilis velku stranku to zhavaruje (ak by bolo URL adries viac ako sa vojde zahashovanych do pamate...;)

martin

Re: Vyhledání hypertextových odkazů
« Odpověď #3 kdy: 08. 05. 2011, 03:51:03 »
cat stranky*.html | ./url_finder.pl

kde url_finder.pl:
....

Také lze, ale je třeba dávat pozor, protože ten skript nenajde reference, které nezačínají schématem (není povinný) a naopak najde URL, která jsou v textu a komentářích, ale nejedná se o odkazy. Pro specifické stránky by to mohlo ale stačit. Jinak je jediná možnost a to sestavení stromu.

naiive

Re: Vyhledání hypertextových odkazů
« Odpověď #4 kdy: 08. 05. 2011, 10:41:29 »
Dobra poznamka, samozrejme sa da upravit regexp, aby to osetrovalo aj tie prislusne situacie (vyzadovat href/src pred URL a ak URL nezacina schematem, doplnit pred nu aktualnu URL, z ktorej ulozena stranka pochadza (ktora zrejme musi byt specifikovana ako parameter, ak pri ukladani nie je ulozeny automaticky i komentar <!-- saved from url=...-->, ako to robi napr chrome))


antaresin

Re: Vyhledání hypertextových odkazů
« Odpověď #5 kdy: 08. 05. 2011, 12:49:08 »
Děkuji pánové,

hodně jsem se naučil a jak bude čas, vlétnu do toho více...Nakonec jsem na netu vydoloval tento skript v perlu a budu mít tu drzost, zeptat se vás ještě na jednu věc.

Kód: [Vybrat]
#!/usr/bin/perl

open SOUBOR, "index.html" or die "Nelze otevřít soubor. $!";
  while (<SOUBOR>){
      print "\<a href=\"$2\">$3\</a>\n" while $_ =~ /
          <A\sHREF=
          (["'])     #uvozovky nebo apostrofy
          ([^\1]*?)  #vše mimo uvozujícího znaku
          \1         #koncová uvozovka nebo apostrof, podle toho, který znak uvozuje
          >
          ([^<]*)    #vše mezi <a href...> a <\/a>
          <\/A>
      /ixg;
  }

Potřeboval bych, aby SOUBOR nebyl přímo index.html, ale aby si vzal např. všechny *.html soubory ve složce. Něco ve smyslu "předat mu výpis find *.html, nebo ls *.html"

martin

Re: Vyhledání hypertextových odkazů
« Odpověď #6 kdy: 08. 05. 2011, 14:22:15 »
Potřeboval bych, aby SOUBOR nebyl přímo index.html, ale aby si vzal např. všechny *.html soubory ve složce. Něco ve smyslu "předat mu výpis find *.html, nebo ls *.html"

obalte to:

Kód: [Vybrat]
foreach $filename (@ARGV) {
   open SOUBOR, $filename ......
   ...
}

Pro zajímavost uvedu i ruby verzi:

Kód: [Vybrat]
require 'rubygems'
require 'hpricot'

ARGV.each do |filename|
   Hpricot(filename).search("a") do |element|
     puts element[:href]               # tiskne pouze atribut href
     puts element                      # tiskne kompletní tag včetně všech atributů a obsahu
   end
end