Tôi muốn phân tích một Trang web thành cấu trúc dữ liệu Perl. Trước tiên tôi tải trang bằngCách phân tích giữa <div class ="foo"> and</div> dễ dàng trong Perl
use LWP::Simple;
my $html = get("http://f.oo");
Bây giờ tôi biết hai cách để giải quyết. Đầu tiên là các biểu thức chính quy và giữ chặt các mô-đun.
Tôi bắt đầu đọc khoảng HTML::Parser và tìm thấy một số ví dụ. Nhưng tôi không chắc chắn về kiến thức của Perl.
mã ví dụ của tôi đi trên
my @links;
my $p = HTML::Parser->new();
$p->handler(start => \&start_handler,"tagname,attr,self");
$p->parse($html);
foreach my $link(@links){
print "Linktext: ",$link->[1],"\tURL: ",$link->[0],"\n";
}
sub start_handler{
return if(shift ne 'a');
my ($class) = shift->{href};
my $self = shift;
my $text;
$self->handler(text => sub{$text = shift;},"dtext");
$self->handler(end => sub{push(@links,[$class,$text]) if(shift eq 'a')},"tagname");
}
Tôi không hiểu tại sao có hai lần một sự thay đổi. Các secound nên là con trỏ tự. Nhưng đầu tiên làm cho tôi nghĩ rằng tham chiếu tự là allready shiftet, được sử dụng như một Hash và Value cho href được lưu trữ trong $class
. Ai đó có thể Giải thích dòng này (my ($class) = shift->{href};
)?
Bên cạnh sự thiếu này, tôi không muốn phân tích tất cả các URL, tôi muốn đặt tất cả mã giữa <div class ="foo">
và </div>
thành chuỗi, trong đó có nhiều mã nằm giữa các thẻ <div></div>
. Vì vậy, tôi hoặc một mô-đun phải tìm đúng điểm. Sau đó tôi đã lên kế hoạch quét chuỗi lần nữa, để tìm các lớp đặc biệt, như <h1>,<h2>, <p class ="foo2"></p>
, v.v.
Tôi hy vọng thông tin này sẽ giúp bạn cung cấp cho tôi một số lời khuyên hữu ích và xin lưu ý rằng trước hết tôi muốn cách hiểu dễ hiểu, không phải là một hoạt động tuyệt vời ở cấp độ đầu tiên!
DON 'T SỬ DỤNG THƯỜNG XUYÊN NÀY! HTML KHÔNG CHẤP NHẬN! –
Cách làm mới để xem ai đó sử dụng trình phân tích cú pháp HTML để phân tích cú pháp HTML thay vì regexes: p +1 chỉ cho rằng – fge
FWIW: 'my ($ class) = shift -> {href};' <- nghĩa là lấy 'href' thành viên băm của đối số đã dịch chuyển. Có thể đã được viết 'my $ ref = shift; $ class = $ ref -> {"href"}; ' – fge