繁体   English   中英

如何使用Perl正则表达式从HTML文件中提取信息?

[英]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正则表达式从该文件中搜索数据。

RegEx匹配XHTML自包含标签以外的打开标签

http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html

使用正则表达式解析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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM