【问题标题】:How can I extract data from HTML tables in Perl?如何从 Perl 中的 HTML 表中提取数据?
【发布时间】:2010-12-11 16:45:15
【问题描述】:

可能重复:
Can you provide an example of parsing HTML with your favorite parser?
How can I extract content from HTML files using Perl?


我正在尝试在 Perl 中使用正则表达式来解析具有以下结构的表。第一行如下:

<tr class="Highlight"><td>Time Played</a></td><td></td><td>Artist</td><td width="1%"></td><td>Title</td><td>Label</td></tr>

这里我想取出“Time Played”、“Artist”、“Title”和“Label”,并将它们打印到输出文件中。

任何帮助将不胜感激!

好的,抱歉...我尝试了很多正则表达式,例如:

$lines =~ / (<td>) /
       OR
$lines =~ / <td>(.*)< /
       OR
$lines =~ / >(.*)< /

我当前的程序如下所示:

#!perl -w

open INPUT_FILE, "<", "FIRST_LINE_OF_OUTPUT.txt" or die $!;

open OUTPUT_FILE, ">>", "PLAYLIST_TABLE.txt" or die $!;

my $lines = join '', <INPUT_FILE>;

print "Hello 2\n";

if ($lines =~ / (\S.*\S) /) {
print "this is 1: \n";
print $1;
    if ($lines =~ / <td>(.*)< / ) {
    print "this is the 2nd 1: \n";
    print $1;
    print "the word was: $1.\n";
    $Time = $1;
    print $Time;
    print OUTPUT_FILE $Time;
    } else {
    print "2ND IF FAILED\n";
    }
} else { 
print "THIS FAILED\n";
}

close(INPUT_FILE);
close(OUTPUT_FILE);

【问题讨论】:

  • 这不是那个问题的真正重复。
  • @Kinopiko:足够接近。想要提取 td 标签和 li 标签之间的部分有什么区别?
  • 顺便说一句,您似乎对您的任务感到困惑:您尝试解析的文本在标签内。你想要的字符串是标记的,可以这么说。

标签: html perl parsing


【解决方案1】:

【讨论】:

  • 在这种情况下,请求的解析相当简单。
  • @Ether 在我看来,有些人喜欢折磨自己。我不知道为什么。
  • @Sinan:我的理论是,正则表达式有一种特殊的学习曲线:起初,它们似乎令人兴奋,以至于没有什么是它们不能(或不应该)做的。因此,任何看起来像解析问题的问题必须可以用正则表达式解决。
【解决方案2】:

使用HTML::TableExtract。真的。

#!/usr/bin/perl

use strict;
use warnings;

use HTML::TableExtract;
use LWP::Simple;

my $file = 'Table3.htm';
unless ( -e $file ) {
    my $rc = getstore(
        'http://www.ntsb.gov/aviation/Table3.htm',
        $file);
    die "Failed to download document\n" unless $rc == 200;
}

my @headers = qw( Year Fatalities );

my $te = HTML::TableExtract->new(
    headers => \@headers,
    attribs => { id => 'myTable' },
);

$te->parse_file($file);

my ($table) = $te->tables;

print join("\t", @headers), "\n";

for my $row ($te->rows ) {
    print join("\t", @$row), "\n";
}

这就是我在另一篇文章中“特定任务”HTML 解析器的意思。

您可以通过将精力集中在阅读一些文档上而不是把正则表达式扔到墙上看看是否有卡住,从而节省大量时间。

【讨论】:

  • 我知道我参加这个聚会很晚了,但getstore() 是一个很好的接触,可以避免敲打某人的服务器。很棒的示例代码。
  • 我投了这个票是因为你提供了工作代码,尽管我很想不这样做,因为你无法抗拒最后讲授 OP。知道要阅读哪些文档并不是那么容易。
  • @SueSpence 感谢您的支持,但是需要提醒那些只是在其格式不受其控制的 HTML 文档中不断抛出一种模式的人有更好的解决方案。我是否可以建议您将有关该主题的工作代码添加到your answer,而不是教我不要教别人?
【解决方案3】:

这很简单:

my $html = '<tr class="Highlight"><td>Time Played</a></td><td></td><td>Artist</td><td width="1%"></td><td>Title</td><td>Label</td></tr>';
my @stuff = $html =~ />([^<]+)</g;
print join (", ", @stuff), "\n";

如果您想尝试运行它,请参阅http://codepad.org/qz9d5Bro

【讨论】:

  • 等到你看到我告诉你这个的 DOWNVOTES。
  • @nick 因为这种方法会让人们一次又一次地浪费更多的时间和精力,每次需要解析 HTML 时总是寻找正确的正则表达式。
  • 用正则表达式解析 JSON 和解析 HTML 一样难,但是之前讨论中的一个人 stackoverflow.com/questions/1598053/… 最教条地认为不使用正则表达式来解析 HTML 然后继续说批准解决涉及使用正则表达式解析 JSON 的问题:stackoverflow.com/questions/1636352/….
  • 好吧,我不能代表别人说话。我确实认为在这种情况下使用正则表达式也是浪费时间。因此,我使用JSON.pm 在该线程中添加了一个 Perl 单行。
  • @Kinopiko,看来 SO 上了解乔姆斯基层次结构的人太少了。用正则表达式解析 JSON 是愚蠢的,甚至比 HTML 还要愚蠢,因为有一个真正的解析器可用,它比任何半途而废的正则表达式解决方案所希望的要简单得多。这证明了 CS 在教育程序员方面的价值。
猜你喜欢
  • 2012-04-28
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 2020-09-30
  • 2011-10-14
  • 2021-03-22
  • 1970-01-01
相关资源
最近更新 更多