![](/img/trans.png)
[英]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.