簡體   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