2014-02-10 4 views
1

Я РЕШЕН ЭТО: Оказывается, страница, которую я загружала с помощью WWW :: Mechanize использует AJAX для загрузки всего содержимого, находящегося внутри <tbody>, так что он не загружается, когда Я создал переменную $ html. Теперь я должен видеть, как получить этот динамический контент ...Не удается получить содержание <tbody> при анализе HTML в Perl


Я пытаюсь разобрать через содержание таблицы в веб-страницы. <table> содержит <thead> и <tbody>. Когда я иду, чтобы получить содержимое из таблицы <tbody>, я обнаружил, что ничто из этого не существует. Я получаю только контент, который находится внутри <thead>.

Я пробовал несколько разных методов, следуя всем, что просто не дает мне ничего изнутри <tbody>.

с использованием HTML :: TreeBuilder

my $tb = HTML::TreeBuilder->new(); 
$tb->parse($html); 
my $table = $tb->look_down(_tag => 'tbody', id => 'tbody-id'); 

с использованием HTML :: TableExtract

my $te = HTML::TableExtract->new(attribs => { id => 'table-id' }); 
$te->parse($html); 
my $table=$te->first_table_found; 

, когда я пытаюсь сделать print Dumper($table); из таблицы Я хочу показать, что я найти <table> и может только см. содержимое таблицы внутри <thead> или <tbody> и ссылку на его родительский элемент, который содержит все содержимое от <thead>.

Мне не понравилось содержание в <thead> Мне просто нужно содержимое таблицы из <tbody>.

Я не уверен, что я делаю неправильно и куда идти отсюда.

+0

Как насчет 'HTML :: TableContentParser'? – David

+0

HTML :: TableContentParser с использованием 'my $ tcp = HTML :: TableContentParser-> new(); my $ tables = $ tcp-> parse ($ html); 'будет захватывать все в' ' и сохранять их как заголовки, но ничего из '' заканчивается в строках – AsocPro

ответ

1

Является ли HTML действительным? Мне потребовалось несколько минут, чтобы получить следующий код, потому что я не закрыл один из тегов:

use strict; 
use warnings; 

use HTML::TreeBuilder; 
use Perl6::Say; 

my $html = << 'HTML'; 
<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <meta charset="utf-8"> 
     <title>title</title> 
     <link rel="stylesheet" href="style.css"> 
     <script src="script.js"></script> 
    </head> 
    <body> 
     <table> 
      <caption>Caption</caption> 
      <thead> 
       <tr> 
        <th>Header</th> 
       </tr> 
      </thead> 
      <tbody> 
       <tr> 
        <td>Body</td> 
       </tr> 
      </tbody> 
     </table> 
    </body> 
</html> 
HTML 

my $tree = HTML::TreeBuilder->new->parse_content($html); 
my $table = $tree->look_down('_tag', 'table'); 
my $caption = $table->look_down('_tag', 'caption'); 
my $thead = $table->look_down('_tag', 'thead'); 
my $tbody = $table->look_down('_tag', 'tbody'); 

say $caption->as_HTML; 
# <caption>Caption</caption> 

say $thead->as_HTML; 
# <thead><tr><th>Header</th></tr></thead> 

say $tbody->as_HTML; 
# <tbody><tr><td>Body</td></tr></tbody> 
+0

Да. Спасибо, что ответ помогает лучше понять, как это будет работать в теории. Выводит страницу, которую я загружал с помощью WWW :: Mechanize использует AJAX для загрузки всего содержимого, находящегося внутри '', поэтому он не загружается, когда я создал переменную $ html. Теперь я должен посмотреть, как получить этот динамический контент ... – AsocPro

+0

Получение сгенерированного контента может быть сложным - вам по сути нужен механизм JavaScript (например, браузер). Вы можете посмотреть [WWW :: Selenium] (https://metacpan.org/pod/WWW::Selenium) или, возможно, даже [Rhino] (https://developer.mozilla.org/en-US/ документы/Rhino). – Mike