2011-01-04 13 views
13

Próbuję parsować następującą strukturę HTML w perlu. Muszę wybrać wszystkie elementy dd, które zawierają wiadomość klasy, a także identyfikator. Wszystko, co chciałbym, aby skrypt wykonał, to zapętlenie wszystkich elementów dd i wydrukowanie id elementu dd, ale musi zignorować pierwszy element dd, ponieważ jest statyczny i nie ulegnie zmianie.Parsowanie HTML w perlu

Może być z dowolnym modułem perla, o ile można go zainstalować z cpan, aby ułatwić mi pracę. Nie mam dużego doświadczenia z perl i parsowaniem html, więc wszelkie wskazówki byłyby bardzo pomocne.

Thanks :)

HTML Struktura:

<pre><code> 
<html> 
<head> 
</head> 
<body> 
.....other elements 
    <div id="messages"> 
     <div class="header"></div> 
     <dl> 
      <dd class="message unread mc-friend mc-message">This is just a random message, do not parse</dd> 
      <dd id="msg2" class="message unread mc-message"> 
       Hello 
      </div> 
      <dd id="msg3" class="message unread mc-message"> 
       Hello 
      </dd> 
     </dl> 
    </div> 
</body> 
</html> 
</pre></code> 
+4

Próbowałaś [coś takiego] (http://lmctfy.org/html%20parser/)? – Ether

+0

Wow, widziałem google, ale jest o wiele lepiej: P Ale tak, wydaje się, że jest ich dużo, ale nie jestem pewien, z którym się połączyć. – Jack

+1

:) ogólnie HTML :: Parser jest świetny, ale możesz mieć konkretne potrzeby, które wskazują Cię gdzie indziej ... jest tu również dobre archiwum podobnych pytań, które mogą ci dać przydatne wskazówki. – Ether

Odpowiedz

18

Coś takiego, szybkie i łatwe:

#! /usr/bin/perl 
use strict; 
use warnings; 

use Mojo::DOM; 

my $html = "Your HTML goes here"; 

my $dom = Mojo::DOM->new; 
$dom->parse($html); 
my $skip; 
for my $dd ($dom->find('dd[class*="message"]')->each) { 
    print $dd->attrs->{id}, "\n" if $skip++; 
} 
+1

Pefect, Mojo :: DOM jest dokładnie tym, czego chcę. :RE – Jack