2014-09-25 4 views
0

Это код, который я хотел бы разобратьКак разобрать html с HTML :: TreeBuilder?

[...] 
<div class="item" style="clear:left;"> 
<div class="icon" style="background-image:url(http://nwn2db.com/assets/builder/icons/40x40/is_acidsplash.png);"> 
</div> 
    <h2>Acid Splash</h2> 
    <p>Caster Level(s): Wizard/Sorcerer 0 
    <br />Innate Level: 0 
    <br />School: Conjuration 
    <br />Descriptor(s): Acid 
    <br />Component(s): Verbal, Somatic 
    <br />Range: Medium 
    <br />Area of Effect/Target: Single 
    <br />Duration: Instant 
    <br />Save: None 
    <br />Spell Resistance: Yes 
    <p> 
    You fire a small orb of acid at the target for 1d3 points of acid damage. 
</div> 
[...] 

Это мой алгоритм:

my $text = ''; 

scan_child($spells); 

print $text, "\n"; 

sub scan_child { 
    my $element = $_[0]; 
    return if ($element->tag eq 'script' or 
      $element->tag eq 'a'); # prune! 
    foreach my $child ($element->content_list) { 
    if (ref $child) { # it's an element 
     scan_child($child); # recurse! 
    } else {   # it's a text node! 
     $child =~ s/(.*)\:/\\item \[$1\]/; #itemize 
     $text .= $child; 
     $text .= "\n"; 
    } 
    } 
    return; 
} 

Он получает образец <key> : <value> и чернослив мусор как <script> или <a>...</a>. Я хотел бы улучшить его, чтобы получить заголовок <h2>...</h2> и весь блок <p>...<p>, поэтому я могу добавить теги LaTeX.

Любой ключ?

Заранее спасибо.

+0

Возможно, вам следует сделать шаг назад и выяснить, какую информацию вы хотите извлечь из страниц, которые вы очищаете, и как вы хотите их сохранить. Если у вас есть определенная схема или структура данных, было бы полезно добавить ее к вопросу. Если вы просто хотите извлечь весь текст, вы уже хорошо поехали туда. –

+0

Возможно, я до сих пор не понял, какой HTML :: TreeBuilder хранится в узлах. – Daniele

ответ

0

Поскольку это может быть XY Проблема ...

Mojo::DOM является несколько более современные рамки для разбора HTML с помощью CSS селекторов. Далее тянет P элемент, который вы хотите из документа:

use strict; 
use warnings; 

use Mojo::DOM; 

my $dom = Mojo::DOM->new(do {local $/; <DATA>}); 

for my $h2 ($dom->find('h2')->each) { 
    next unless $h2->all_text eq 'Acid Splash'; 

    # Get following P 
    my $next_p = $h2; 
    while ($next_p = $next_p->next_sibling()) { 
     last if $next_p->node eq 'tag' and $next_p->type eq 'p'; 
    } 

    print $next_p; 
} 

__DATA__ 
<html> 
<body> 
<div class="item" style="clear:left;"> 
<div class="icon" style="background-image:url(http://nwn2db.com/assets/builder/icons/40x40/is_acidsplash.png);"> 
</div> 
    <h2>Acid Splash</h2> 
    <p>Caster Level(s): Wizard/Sorcerer 0 
    <br />Innate Level: 0 
    <br />School: Conjuration 
    <br />Descriptor(s): Acid 
    <br />Component(s): Verbal, Somatic 
    <br />Range: Medium 
    <br />Area of Effect/Target: Single 
    <br />Duration: Instant 
    <br />Save: None 
    <br />Spell Resistance: Yes 
    <p> 
    You fire a small orb of acid at the target for 1d3 points of acid damage. 
</div> 
</body> 
</html> 

Выходов:

<p>Caster Level(s): Wizard/Sorcerer 0 
    <br>Innate Level: 0 
    <br>School: Conjuration 
    <br>Descriptor(s): Acid 
    <br>Component(s): Verbal, Somatic 
    <br>Range: Medium 
    <br>Area of Effect/Target: Single 
    <br>Duration: Instant 
    <br>Save: None 
    <br>Spell Resistance: Yes 
    </p> 
0

я использую HTML сканирования look_down() метода. Использование look_down() Я могу вернуть сначала получить список всех divs класса = "item".

Затем я могу повторить их и найти и обработать h2 и p, которые я затем разделил бы с помощью // в качестве моего сплиттера.

 Смежные вопросы

  • Нет связанных вопросов^_^