Par
s
er
s
161
Top-down par
s
er
s
An 
LL
(scan left, expand leftmost subrule) parser will start by trying to match the
highest level rule first (the sentence rule in our example). To do that, it needs to
match the subrules within the top-level rule, so it would start to match the subject
rule and so on down the grammar. Once it has matched all of the terminals in a rule,
it knows that has matched that rule. Figure 8.4 shows the route that an 
LL
parser
would take when trying to match an input stream against out sample grammar.
Matching all of the subrules in a production means that it has matched the pro-
duction and, therefore, the rule that the production is part of. If the parser matches
all of the subrules and terminals in one of the productions of the top-level rule,
then the parse has succeeded. If the parser runs out of productions to try before
matching the top-level rule, then the parse has failed. For obvious reasons, this type
of parser is also known as a top-down parser.
8.3.2 Parsers in Perl
Parsers in Perl come in two types: prebuilt parsers such as 
HTML::Parser
and
XML::Parser
, which are designed to parse a particular type of data, and modules
PRONOUN
s
e
nt
e
nc
e
s
e
q
u
e
n
c
e
o
f
s
ubj
e
ct
obj
e
ct
noun_phr
a
s
e
o
n
e
o
f
VERB
PROPER
_NOUN
ARTICLE
NOUN
s
e
q
u
e
n
c
e
o
f
Figur
e
8.4 LL Par
s
e
r
Pdf rotate just one page - rotate PDF page permanently in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Empower Users to Change the Rotation Angle of PDF File Page Using C#
how to rotate all pages in pdf at once; rotate individual pages in pdf reader
Pdf rotate just one page - VB.NET PDF Page Rotate Library: rotate PDF page permanently in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
PDF Document Page Rotation in Visual Basic .NET Class Application
how to reverse pages in pdf; how to rotate pdf pages and save
164
CHAPTER 
HTML
Since the explosion in interest in the World Wide Web in the 1990s, 
HTML
has
become one of the most popular file formats that we can use for the purpose of
extracting data. At the end of the 1990s it seemed more and more likely that 
HTML
would be overtaken in terms of popularity by its younger cousin, 
XML
.
In this chapter we will look at 
HTML
and see how to extract the data that we
need from 
HTML
documents. 
9.1
Ex
t
rac
t
ing HTML da
t
a from 
t
he World Wide Web
Perl has a set of modules which can be used to read data from the World Wide Web.
This set of modules is called 
LWP
(for Library for 
WWW
Programming in Perl) and
you can find it on the 
CPAN
under the name libwww.1 LWP contains modules for
gleaning data from the 
WWW
under a large number of conditions. Here we will
look at only the simplest module that it contains. If these methods don’t work for
you then you should take a close look at the documentation that comes with 
LWP
.
The simplest method to use when pulling data down from the 
web
is the
LWP::Simple
module. This module exports a number of functions which can send
an 
HTTP
request and handle the response. The simplest of these is the 
get
func-
tion. This function takes a 
URL
as an argument and returns the data that is returned
when that 
URL
is requested. For example:
use LWP::Simple;
my $page = get('http://www.mag-sol.com/index.html');
will put the contents of the requested page into the variable 
$page
. If there is an
error, then 
get
will return 
undef
.
Two of the most common steps that you will want to take with the data returned
will be to print it out or to store it in a file. 
LWP::Simple
has functions that carry
out both of these options with a single call:
getprint('http://www.mag-sol.com/index.html');
will print the page directly to 
STDOUT
and 
getstore('http://www.mag-sol.com/index.html', 'index.html');
will store the data in the (local) file 
index.html
.
1
If, however, you are using ActiveState’s ActivePerl for Windows, you’ll find that LWP is part of the stan-
dard installation.
VB.NET PDF Page Extract Library: copy, paste, cut PDF pages in vb.
functions, including extracting one or more page(s) from PDF document. To utilize the PDF page(s) extraction function in VB.NET application, you just need to
pdf rotate page; rotate a pdf page
VB Imaging - VB MSI Plessey Barcode Tutorial
Resolution = 96 'set rotation barcode.Rotate = Rotate.Rotate0 barcode 100F, 100F)) docx.Save("C:\\Sample_Barcode.pdf"). Below is just an example of generating an
permanently rotate pdf pages; rotate pdf pages individually
Par
s
i
ng HTML
165
9.2
Parsing 
HTML
Parsing 
HTML
in Perl is all based around the 
HTML::Parser
CPAN
module.2 This
module takes either an 
HTML
file or a chunk of 
HTML
in a variable and splits it into
individual tokens. To use 
HTML::Parser
we need to define a number of handler
subroutines which are called by the parser whenever it encounters certain construc-
tions in the document being parsed.
The 
HTML
that you want to parse can be passed to the parser in a couple of
ways. If you have it in a file you can use the 
parse_file
method, and if you have it
in a variable you can use the 
parse
method.
9.2.1 Example
:
simple 
HTML
parsing
Here is a very simple 
HTML
parser that displays all of the 
HTML
tags and attributes
it finds in an 
HTML
page.
use HTML::Parser;
use LWP::Simple;
sub start {
my ($tag, $attr, $attrseq) = @_;
print "Found $tag\n";
foreach (@$attrseq) {
print " [$_ -> $attr->{$_}]\n";
}
}
my $h = HTML::Parser->new(start_h => [\&start, 'tagname,attr,attrseq']);
my $page = get(shift);
$h->parse($page);
In this example, we define one handler, which is called whenever the parser encoun-
ters the start of an 
HTML
tag. The subroutine 
start
is defined as being a handler
as part of the 
HTML::Parser->new
call. Notice that we pass 
new
a hash of values.
The keys to the hash are the names of the handlers and the values are references to
arrays that define the associated subroutines. The first element of the referenced
array is a reference to the handler subroutine and the second element is a string that
defines the parameters that the subroutine expects. In this case we require the name
of the tag, a hash of the tag’s attributes, and an array which contains the sequence
2
Note that what I am describing here is 
HTML::Parser
version 3. In this version, the module was rewritten
so that it was implemented in C for increased performance. The interface was also changed. Unfortunately,
the version available for ActivePerl on Win32 platforms still seems to be the older, pure Perl version, which
doesn’t support the new interface.
VB.NET TIFF: Rotate TIFF Page by Using RaterEdge .NET TIFF
specific formats are: JPEG, PNG, GIF, BMP, PDF, Word (Docx the target TIFF page(s) accurately and quickly; Rotate single or TIFF page(s) at one time just as you
rotate pdf page and save; rotate all pages in pdf preview
C# Imaging - C# MSI Plessey Barcode Tutorial
96;// set resolution barcode.Rotate = Rotate.Rotate0;// set 100F, 100F)); docx.Save(outputDirectory + "Sample_Barcode.pdf"); }. Below is just an example of
pdf rotate page and save; rotate one page in pdf reader
166
CHAPTER 
HTML
in which the attributes were originally defined. All parameters are passed to the han-
dler as scalars. This means that the attribute hash and the attribute sequence array
are actually passed as references.
In the 
start
subroutine, we simply print out the type of the 
HTML
element that
we have found, together with a list of its attributes. We use the 
@$attrseq
array to
display the attributes following the same order in which they were defined in the
original 
HTML
. Had we relied on 
keys %$attr
, we couldn’t have guaranteed the
attributes appearing in any particular order.
Tes
t
ing 
t
he simple 
HTML
parser
In order to test this, here is a simple 
HTML
file:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head><title>Test HTML Page</title></head>
<body bgcolor="#FFDDDD">
<h1 ALIGN=center>test HTML Page</h1>
<p>This is the first paragraph</p>
<p><font color="#0000FF">This</font> is the 2nd paragraph</p>
<p>Here is a list</p>
<ol><li>Item one</li>
<li>Item two</li></ul>
</body>
</html>
and here is the output we get from running it through our parser:
Found html
Found head
Found title
Found body
[bgcolor -> #FFDDDD]
Found h1
[align -> center]
Found p
Found p
Found font
[color -> #0000FF]
Found p
Found ol
Found li
Found li
Each time the parser finds an 
HTML
element, it calls 
start
, which displays infor-
mation about the element and its attributes. Notice that none of the actual text of
the document appears in our output. For that to happen we would need to define
a text handler. You would do that by declaring a 
text_h
key/value
pair in the
VB.NET Word: How to Process MS Word in VB.NET Library in .NET
How to Rotate, Merge Word Documents Within VB.NET of the web page, here we just describe each Word powerful & profession imaging controls, PDF document, image
pdf reverse page order; rotate one page in pdf
C# Image Convert: How to Convert MS PowerPoint to Jpeg, Png, Bmp
RasterEdge.XDoc.PDF.dll. The last one is for rendering PowerPoint file to raster image Gif. This demo code just converts PowerPoint first page to Gif image.
rotate pdf page by page; how to rotate a pdf page in reader
Prebu
i
lt HTML par
s
er
s
167
call to 
HTML::Parser->new
. You would define the handler in the same way, but in
this case you might choose a different set of parameters. Depending on what your
script was doing, you would probably choose the 
text
or 
dtext
parameters. Both
of these parameters give you the text found, but in the 
dtext
version any 
HTML
entities are decoded.
You can see how easy it is to build up a good idea of the structure of the docu-
ment. If you wanted a better picture of the structure of the document, you could
also define an 
end
handler and display information about closing tags as well. One
option might be to keep a global variable, which was incremented each time a start
tag was found, and decremented each time a close tag was found. You could then
use this value to indent the data displayed according to how deeply nested the
element was.
9.3
Prebuil
t
HTML
parsers
HTML::Parser
gives you a great deal of flexibility to parse 
HTML
files in any way
that you want. There are, however, a number of tasks that are common enough that
someone has already written an 
HTML::Parser
subclass to carry them out.
9.3.1
HTML
:
:
LinkEx
t
or
One of the most popular is 
HTML::LinkExtor
which is used to produce a list of all
of the links in an 
HTML
document. There are two ways to use this module. The
simpler way is to parse the document and then run the 
links
function, which
returns an array of the links found. Each of the elements in this array is a reference
to another array. The first element of this second-level array is the type of element in
which the link is found. The subsequent elements occur in pairs. The first element
in a pair is the name of an attribute which denotes a link, and the second is the value
of that attribute. This should become a bit clearer with an example. 
Example
:
lis
t
ing links wi
t
HTML
:
:
LinkEx
t
or
Here is a program which simply lists all of the links found in an 
HTML
file.
use HTML::LinkExtor;
my $file = shift;
my $p = HTML::LinkExtor->new;
$p->parse_file($file);
my @links = $p->links;
foreach (@links) {
print 'Type: ', shift @$_, "\n";
168
CHAPTER 
HTML
while (my ($name, $val) = splice(@$_, 0, 2)) {
print "
$name -> $val\n";
}
}
and here is a sample 
HTML
file which contains a number of links of various kinds:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head><title>Test HTML Page</title>
<link rel=stylesheet type='text/css' href='style.css'></head>
<body background="back.gif">
<h1 ALIGN=center>test HTML Page</h1>
<p>This is the first paragraph.
It contains a <a href="http://www.perl.com/">link</a></p>
<p><font color="#0000FF">This</font> is the 2nd paragraph.
It contains an image - <img src="test.gif"></p>
<p>Here is an image used as a link<br>
<a href="http://www.pm.org"><img src="pm.gif" lowsrc="pmsmall.gif"></a></p>
</body>
</html>
When we run this program on this 
HTML
file, the output is as follows:
Type: link
href -> style.css
Type: body
background -> back.gif
Type: a
href -> http://www.perl.com/
Type: img
src -> test.gif
Type: a
href -> http://www.pm.org
Type: img
src -> pm.gif
lowsrc -> pmsmall.gif
Example
:
lis
t
ing specific 
t
ypes of links wi
t
HTML
:
:
LinkEx
t
or
As you can see, there are a number of different types of links that 
HTML:LinkExtor
returns. The complete list changes as the 
HTML
specification changes, but basically
any element that can refer to an external file is examined during parsing. If you only
want to look at, say, links within an 
a
tag, then you have a couple of options. You
can either parse the file as we’ve just discussed and only use the links you are inter-
ested in when you iterate over the list of links (using code something like: 
next
unless
$_->[0]
eq
'a'
), or you can use the second, more complex, interface to
HTML::LinkExtor
. For this interface, you need to pass the 
new
function a refer-
ence to a function which the parser will call each time it encounters a link. This
Prebu
i
lt HTML par
s
er
s
169
function will be passed the name of the element containing the link together with
pairs of parameters indicating the names and values of attributes which contain the
actual links. Here is an example which displays only the 
a
links within a file:
use HTML::LinkExtor;
my $file = shift;
my $p = HTML::LinkExtor->new(\&check);
$p->parse_file($file);
my @links;
foreach (@links) {
print 'Type: ', shift @$_, "\n";
while (my ($name, $val) = splice(@$_, 0, 2)) {
print "
$name -> $val\n";
}
}
sub check {
push @links, [@_] if $_[0] eq 'a';
}
Running our test 
HTML
file through this program gives us the following output:
Type: a
href -> http://www.perl.com/
Type: a
href -> http://www.pm.org
which only lists the links that we are interested in.
9.3.2
HTML
:
:
TokeParser
Another useful prebuilt 
HTML
parser module is 
HTML::TokeParser
. This parser effec-
tively turns the standard 
HTML::Parser
interface on its head. 
HTML::TokeParser
parses the file and stores the contents as a stream of tokens. You can request the next
token from the stream using the 
get_tag
method. This method takes an optional
parameter which is a tag name. If this argument is used then the parser will skip tags
until it reaches a tag of the given type. There is also a 
get_text
function which returns
the text at the current position in the stream. 
Example
:
ex
t
rac
t
ing <h1> elemen
t
s wi
t
HTML
:
:
TokeParser
For example, to extract all of the 
<h1>
elements from an 
HTML
file you could use
code this way:
use HTML::TokeParser;
my $file = shift;
170
CHAPTER 
HTML
my $p = HTML::TokeParser->new($file);
while ($p->get_tag('h1')) {
print $p->get_text(), "\n";
}
We will use the following 
HTML
file to test this program:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head><title>Test HTML Page</title>
</head>
<body>
<h1>The first major item</h1>
<h2>Section 1.1</h2>
<p>Some text<p>
<h2>Section 1.2</h2>
<h3>Section 1.2.1</h3>
<p>blah</p>
<h3>Section 1.2.2</h3>
<p>blah</p>
<h1>Another major header</h1>
<h2>Section 2.1</h2>
<h3>Section 2.1.1</h3>
<h3>Section 2.1.2</h3>
<h2>Section 2.2</h2>
</body>
</html>
and here is the output:
The first major item
Another major header
Example
:
lis
t
ing all header 
t
ags wi
t
HTML
:
:
TokeParser
A more sophisticated approach might be to look at the structure of the document
by examining all of the headers in the document. In this case we need to look a little
more closely at the return value from 
get_tag
. This is a reference to an array, the
elements of which are different for start tags and close tags. For start tags the ele-
ments are: the tag name, a reference to a hash containing attribute names and val-
ues, a reference to an array indicating the original order of the attributes, and the
original 
HTML
text. For an end tag the array contains the name of the tag prefixed
with the character 
/
and the original 
HTML
text.
We can therefore iterate over all of the tags in a document, checking them to see
which ones are headers and displaying the structure of the document using code
like this:
use HTML::TokeParser;
my $file = shift;
Documents you may be interested
Documents you may be interested