Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > HTML::TreeBuilder::XPatx


Автор: infarch 25.8.2010, 17:01
Помогите пожалуйста выяснить в чем проблема! Я с помощью вышеуказанного модуля пытаюсь извлечь информацию из страницы. Вот к примеру попытался получить список ссылок на курсы в в3скулс: 

Код


    use LWP::Simple qw(get getstore);
    
    my $content    = get('http://www.w3schools.com/default.asp');
    
    my $t = HTML::TreeBuilder::XPath->new;
    $t->parse_content($content);

    my @nodes = $t->findnodes( q{//*[@id="leftcolumn"]/a} );

    foreach my $node ( @nodes ){
        
        my $val = $node->findvalue( q{/a/@href} );
        print $val, "\n";
        
        #print $node->as_HTML(), "\n";
        
        
    }



После выполнения " $t->findnodes" я получаю массив нод <a>. теперь я хочу получить их значения href и вот тут получается облом - возвращаются пустые значения. В чем может быть дело? Я уже n вариантов перепробовал, ничего не выходит :(
Конечно, я мог бы написать "$node->attr('href')", но это мне не подходит, ведь нода может иметь и более сложную структуру чем один тег, хочется использовать XPath.


Автор: arto 25.8.2010, 17:30
perldoc HTML::Element

Автор: infarch 25.8.2010, 17:39
Я догадывался что мне напишут нечто в этом роде smile . Но дело в том что с точки зрения елемента у меня проблем нет, я пытаюсь XPath освоить.

Автор: dva300 25.8.2010, 18:09
потому что надо примерно так...

Код

use LWP::Simple;
use HTML::TreeBuilder::XPath;
my $content = get('http://www.w3schools.com/default.asp');
   
my $t = HTML::TreeBuilder::XPath->new;
$t->parse_content($content);
for my $node  ($t->findnodes( q{//*[@id="leftcolumn"]/a} ))
    {       
        $node->detach();
        print  $node->findvalue( q{/a/@href} ), "\n";
    }


P.S.
вместо detach можно еще использовать $node->clone->findvalue( q{/a/@href} ), "\n";

Автор: infarch 25.8.2010, 18:16
Идея интересная, но это не всегда подойдет, ведь детач выводит ноду из модели, а она там може еще пригодится. Не люблю нарушать структуру ихсодных данных. Я тут уже нащупал более коректный вариант:

print  $node->findvalue( q{./@href} ), "\n";

Автор: dva300 25.8.2010, 18:25
Цитата

... Не люблю нарушать структуру ихсодных данных. 


хозяин - барин.

вот http://www.perlmonks.org/?node_id=722000 есть обсуждение этого вопроса 

Автор: infarch 25.8.2010, 18:30
Я этот вариант (q{./@href}) там и высмотрел smile В общем, разобрался методом битья в бубен и гугления.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)