[英]How can I extract specific columns with header names from an HTML file using Perl's HTML::TableExtract
[英]How can I extract information from an HTML file using Perl regular expressions?
我有两个文件,即XML和HTML,并且需要以某些模式从这些文件中提取数据。
我的XML文件格式很好,可以使用readline读取行并在标签之间搜索数据。
if($line =~ /\<tag1\>$varvalue\<\/tag1\>/)`
但是,对于我的HTML,它具有我所见过的最糟糕的代码之一,文件如下:
<div class="theater">
<h2>
<a href="/showtimes/university-village-3" >**University Village 3**</a></h2>
<div class="address">
<i>**3323 South Hoover Street, Los Angeles CA 90007 | (213) 748-6321**</i>
</div>
</div>
<div class="mtitle">
<a href="/movie/dream-house-2011" title="Dream House" onmouseover="mB(event, 771204354);" >**Dream House**</a>
<span>**(PG-13 , 1 hr. 31 min.)**</span>
</div>
<div class="times">
**1:00 PM,**
</div>
现在,我需要从该文件中选择以粗体显示的数据。
我可以使用Perl正则表达式从该文件中搜索数据。
http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html
当您阅读完这些内容后,再回来:)
编辑:并实际解决您的问题,请看以下模块:
http://perlmeme.org/tutorials/html_parser.html
一些示例来解析一个html文件:
#!/usr/local/bin/perl
use HTML::TreeBuilder;
$tree = HTML::TreeBuilder->new;
$tree->parse_file('C:\Users\Stefanos\workspace\HTML_Parser_Test\test.html');
@divs = $tree->find('div');
$tree->delete;
在此示例中,我只是将您的标签用作.html文件的主体。 divs存储在@divs数组中。 由于我不知道要查找哪个文本,因为**不是元素,所以我无法进一步帮助您。
PS我从未使用过此模块,但我只是在5分钟内完成了该操作,因此解析html文件并找到您想要的内容并不是那么困难。
正则表达式可将任何特定的标记和内容存储区匹配到$ 1中:
if ($subject =~ m!<tagname[^>]*>(.*?)</tagname>!s) {
# Successful match
}
尽管当您嵌套元素时很快就会意识到这种方法的局限性。
用实际标签替换标签名。.例如,在您的情况下,i,a,span,div,尽管对于div,您还将获得第一个div的内容,这不是您想要的。
使用正则表达式解析XML和HTML是一个傻瓜 。 有许多简单易用的Perl模块可用于解析HTML。 这是使用HTML :: TokeParser :: Simple的东西。 我已经省略了将电影和放映时间与剧院关联的代码(因为我无意构建适当的输入文件):
#!/usr/bin/env perl
use strict; use warnings;
use HTML::TokeParser::Simple;
my $parser = HTML::TokeParser::Simple->new(handle => \*DATA);
my @theaters;
while (my $div = $parser->get_tag('div')) {
my $class = $div->get_attr('class');
next unless defined($class) and $class eq 'theater';
my %record;
$record{theater} = $parser->get_text('/a');
$record{address} = $parser->get_text('/i');
s{(?:^\s+)|(?:\s+\z)}{} for values %record;
push @theaters, \%record;
}
use YAML;
print Dump \@theaters;
__DATA__
<div class="theater">
<h2>
<a href="/showtimes/university-village-3" >**University Village 3**</a></h2>
<div class="address">
<i>**3323 South Hoover Street, Los Angeles CA 90007 | (213) 748-6321**</i>
</div>
</div>
<div class="mtitle">
<a href="/movie/dream-house-2011" title="Dream House" onmouseover="mB(event, 771204354);" >**Dream House**</a>
<span>**(PG-13 , 1 hr. 31 min.)**</span>
</div>
<div class="times">
**1:00 PM,**
</div>
<div class="theater">
<h2>
<a href="/showtimes/university-village-3" >**Some other theater*</a></h2>
<div class="address">
<i>**1234 South Hoover Street, St Paul, MN 99999 | (999) 748-6321**</i>
</div>
</div>
输出:
[sinan@macardy]:~/tmp> ./tt.pl --- - address: '**3323 South Hoover Street, Los Angeles CA 90007 | (213) 748-6321**' theater: '**University Village 3**' - address: '**1234 South Hoover Street, St Paul, MN 99999 | (999) 748-6321**' theater: '**Some other theater*'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.