File Coverage

blib/lib/WebSource/Parser.pm
Criterion Covered Total %
statement 4 6 66.6
branch n/a
condition n/a
subroutine 2 2 100.0
pod n/a
total 6 8 75.0


line stmt bran cond sub pod time code
1             package WebSource::Parser;
2              
3 2     2   1179 use strict;
  2         6  
  2         64  
4 2     2   988 use XML::LibXML;
  0            
  0            
5             use HTML::TreeBuilder;
6              
7             {
8             package MyTreeBuilder;
9             our @ISA = ('HTML::TreeBuilder');
10              
11             sub start {
12             my ($self,$tag,$attr,$attrseq,$origtext) =@_;
13             my %nattr;
14             my @naseq;
15             # Clean up attributes
16             foreach my $a (@$attrseq) {
17             if($a =~ m#[^\w_:\-]#) {
18             $self->{verbose} and warn "Bad attribute $a detected and removed";
19             } else {
20             push @naseq, ($a);
21             $nattr{$a} = $attr->{$a};
22             }
23             }
24             $self->SUPER::start($tag,\%nattr,\@naseq,$origtext);
25             }
26             sub text {
27             my ($self,$origtext,$iscdata) = @_;
28             if(!$iscdata) {
29             $origtext =~ /Sion/ and print "Text : $origtext\n";
30             if($origtext =~ m/\0/) {
31             $self->{verbose} and warn "Decected null char\n";
32             $origtext =~ s/\0//g;
33             }
34             if($origtext =~ m/\&\#[0-9]\;/) {
35             warn "Bad entity detected";
36             $origtext =~ s/\&\#[0-9]\;//g;
37             }
38             }
39             $self->SUPER::text($origtext,$iscdata);
40             }
41              
42             }
43              
44             our @ISA = ("XML::LibXML");
45             =head1 NAME
46              
47             WebSource::Parser - A XML/HTML parser extending XML::LibXML
48              
49             =head1 DESCRIPTION
50              
51             A simple XML::LibXML extention to be more robust in parsing HTML by
52             using HTML::TreeBuilder
53              
54             =head1 SYNOPSIS
55              
56             my $parser = WebSource::Parser->new;
57              
58             =head1 METHODS
59              
60             =over 2
61              
62             =item B<< $parser = WebSource::Parser->new; >>
63              
64             Create a new WebSource::Parser
65              
66             =cut
67              
68             sub new {
69             my $class = shift;
70             my $self = $class->SUPER::new(verbose => 1, @_);
71             return $self;
72             }
73              
74             =item B<< $parser->parse_html_file($file); >>
75              
76             Parse an html file
77              
78             =cut
79              
80             sub parse_html_file {
81             my $self = shift;
82             my $file = shift;
83             my $tb = MyTreeBuilder->new;
84             # $tb->xml_mode(1);
85             $tb->parse_file($file);
86             return $self->SUPER::parse_string($tb->as_XML);
87             }
88              
89             =item B<< $parser->parse_html_string($string); >>
90              
91             Parse an html string
92              
93             =cut
94              
95             sub parse_html_string {
96             my $self = shift;
97             my $string = shift;
98             my $tb = MyTreeBuilder->new;
99             $tb->parse($string);
100             $tb->eof;
101             return $self->SUPER::parse_string($tb->as_XML);
102             }
103              
104             =item B<< $parser->parse_html_string($string); >>
105              
106             Parse an HTML string chunk and return the corresponding nods
107              
108             =cut
109              
110             sub parse_html_chunks {
111             my $self = shift;
112             my $string = shift;
113             my $tb = MyTreeBuilder->new;
114             $tb->parse($string);
115             $tb->eof;
116             return map { $self->SUPER::parse_string($tb->as_XML) } $tb->guts();
117             }
118              
119             =head1 SEE ALSO
120              
121             XML::LibXML
122              
123             =cut
124              
125             1;