извлечь все ссылки со страницы HTML, исключить ссылки из определенной таблицы

Я новичок в Perl / HTML. Вот что я пытаюсь сделать с WWW :: Mechanize и HTML :: TreeBuilder :

Для каждой страницы химических элементов в Википедии мне нужно извлечь все гиперссылки, которые укажите на страницы других химических элементов в вики и распечатайте каждую уникальную пару в следующем формате:

Atomic_Number1 (Chemical Element Title1) -> Atomic_Number2 (Chemical Element Title2)

Единственная проблема заключается в том, что на странице каждого химического элемента (вверху справа) есть мини-периодическая таблица. Эта крошечная таблица Менделеева даст одинаковый результат для всех элементов. У меня проблемы с извлечением всех ссылок со страницы, ЗА ИСКЛЮЧЕНИЕМ этой самой таблицы.

Мне нужно извлечь все гиперссылки, указывающие на ...

Я новичок в Perl / HTML. Вот что я пытаюсь сделать с WWW :: Mechanize и HTML :: TreeBuilder :

Для каждой страницы химических элементов в Википедии мне нужно извлечь все гиперссылки, которые укажите на страницы других химических элементов в вики и распечатайте каждую уникальную пару в следующем формате:

Atomic_Number1 (Chemical Element Title1) -> Atomic_Number2 (Chemical Element Title2)

Единственная проблема заключается в том, что на странице каждого химического элемента (вверху справа) есть мини-периодическая таблица. Эта крошечная таблица Менделеева даст одинаковый результат для всех элементов. У меня проблемы с извлечением всех ссылок со страницы, ЗА ИСКЛЮЧЕНИЕМ этой самой таблицы.

Мне нужно извлечь все гиперссылки, указывающие на ...

Я новичок в Perl / HTML. Вот что я пытаюсь сделать с WWW :: Mechanize и HTML :: TreeBuilder :

Для каждой страницы химических элементов в Википедии мне нужно извлечь все гиперссылки, которые укажите на страницы других химических элементов в вики и распечатайте каждую уникальную пару в следующем формате:

Atomic_Number1 (Chemical Element Title1) -> Atomic_Number2 (Chemical Element Title2)

Единственная проблема заключается в том, что на странице каждого химического элемента (вверху справа) есть мини-периодическая таблица. Эта крошечная таблица Менделеева даст одинаковый результат для всех элементов. У меня проблемы с извлечением всех ссылок со страницы, ЗА ИСКЛЮЧЕНИЕМ этой самой таблицы.

Механизировать и HTML :: TreeBuilder :

Для каждой страницы химических элементов в Википедии мне нужно извлечь все гиперссылки, которые указывают на страницы других химических элементов в вики, и распечатать каждую уникальную пару в этот формат:

Atomic_Number1 (Chemical Element Title1) -> Atomic_Number2 (Chemical Element Title2)

Единственная проблема заключается в том, что на странице каждого химического элемента (вверху справа) есть мини-периодическая таблица. Эта крошечная таблица Менделеева даст одинаковый результат для всех элементов. У меня проблемы с извлечением всех ссылок со страницы, ЗА ИСКЛЮЧЕНИЕМ этой самой таблицы.

Механизировать и HTML :: TreeBuilder :

Для каждой страницы химических элементов в Википедии мне нужно извлечь все гиперссылки, которые указывают на страницы других химических элементов в вики, и распечатать каждую уникальную пару в этот формат:

Atomic_Number1 (Chemical Element Title1) -> Atomic_Number2 (Chemical Element Title2)

Единственная проблема заключается в том, что на странице каждого химического элемента (вверху справа) есть мини-периодическая таблица. Эта крошечная таблица Менделеева даст одинаковый результат для всех элементов. У меня проблемы с извлечением всех ссылок со страницы, ЗА ИСКЛЮЧЕНИЕМ этой самой таблицы.

Atomic_Number1 (Chemical Element Title1) -> Atomic_Number2 (Chemical Element Title2)

Единственная проблема заключается в том, что на странице каждого химического элемента (вверху справа) есть мини-таблица Менделеева. Эта крошечная таблица Менделеева даст одинаковый результат для всех элементов. У меня проблемы с извлечением всех ссылок со страницы, ЗА ИСКЛЮЧЕНИЕМ этой самой таблицы.

Atomic_Number1 (Chemical Element Title1) -> Atomic_Number2 (Chemical Element Title2)

Единственная проблема заключается в том, что на странице каждого химического элемента (вверху справа) есть мини-таблица Менделеева. Эта крошечная таблица Менделеева даст одинаковый результат для всех элементов. У меня проблемы с извлечением всех ссылок со страницы, ЗА ИСКЛЮЧЕНИЕМ этой самой таблицы.

[Примечание: я смотрел на $ elem == 6 (Carbon) (@line 42) только для простоты отладки.]


Вот мой код:

#!/usr/bin/perl -w

use strict;
use warnings;
use WWW::Mechanize;
use HTML::TreeBuilder;
my $mech = WWW::Mechanize->new( autocheck => 1 );

$mech = WWW::Mechanize->new();

my $table_url = "http://en.wikipedia.org/wiki/Periodic_table";

$mech->agent('Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-us) /
              AppleWebKit/533.17.8 (KHTML, like Gecko) Version/5.0.1   /
              Safari/533.17.8');

$mech->get($table_url);

my $tree = HTML::TreeBuilder->new_from_content($mech->content);
my %elem_set;
my $atomic_num;

## obtain a hash array of elements and corresponding titles and links
foreach my $td ($tree->look_down(_tag => 'td')) {

  # If there's no  in this , then skip it:
  my $a = $td->look_down(_tag => 'a') or next;

  my $tdText = $td->as_text;
  my $aText  = $a->as_text;

  if($tdText =~ m/^(\d+)\S+$/){
    if($1 <= 114){  #only investigate up to 114th element
      $atomic_num = $1;
    }
    $elem_set{$atomic_num} = [$a->attr('title'), $a->attr('href')];
  }
}

## In each element's page. look for links to other elements in the set
foreach my $elem (keys %elem_set) {
  if($elem == 6){
    # reconstruct element url to ensure only fetch pages in English
    my $elem_url = "http://en.wikipedia.org" . $elem_set{$elem}[1];
    $mech->get($elem_url);

    #####################################################################
    ### need help here to exclude links from that mini periodic table ###
    #####################################################################

    my @target_links = $mech->links();
    for my $link ( @target_links ) {
      if( $link->url =~ m/^\/(wiki)\/.+$/ && $link->text =~ m/^\w+$/ ){
        printf("%s, %s\n", $link->text, $link->url);
      }
    }

  }
}

1
задан Z.Zen 13 September 2010 в 19:30
поделиться