代码之家  ›  专栏  ›  技术社区  ›  Geo

如何处理Perl中格式错误的HTML?

  •  5
  • Geo  · 技术社区  · 15 年前

    我对一个解析器很感兴趣,它可以获取一个格式错误的HTML页面,并在对其执行一些XPath查询之前将其转换为格式良好的HTML。你知道吗?

    3 回复  |  直到 15 年前
        1
  •  13
  •   Sinan Ünür    15 年前

    不应该使用XML分析器来分析HTML。使用HTML分析器。

    请注意,以下是完全有效的HTML(XML解析器可能会阻塞它):

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
        "http://www.w3.org/TR/html4/strict.dtd">
    
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Is this valid?</title>
    </head>
    
    <body>
    
    <p>This is a paragraph
    
    <table>
    
    <tr>  <td>cell 1  <td>cell 2
    <tr>  <td>cell 3  <td>cell 4
    
    </table>
    
    </body>
    
    </html>
    

    CPAN上有许多特定于任务的(除了通用的)HTML解析器。它们非常适合我处理各种各样的非常混乱(大多数时候是无效的)HTML。

    如果你能详细说明你要解决的问题,就有可能给出具体的建议。

    也有 HTML::TreeBuilder::XPath 其中使用 HTML::Parser 将文档解析为树,然后允许您使用xpath查询它。我从来没有用过,但看到兰德尔·施瓦茨的 HTML Scraping with XPath .

    给定上面的HTML文件,下面的简短脚本:

    #!/usr/bin/perl
    
    use strict; use warnings;
    
    use HTML::TreeBuilder::XPath;
    my $tree= HTML::TreeBuilder::XPath->new;
    
    $tree->parse_file("valid.html");
    my @td = $tree->findnodes_as_strings('//td');
    
    print $_, "\n" for @td;
    

    输出:

    C:\Temp> z
    cell 1
    cell 2
    cell 3
    cell 4
    

    这里的关键点是,该文档是由HTML解析器作为HTML文档来解析的(尽管我们能够使用xpath查询它)。

        2
  •  1
  •   AnonJr    15 年前

    除非你想 learn more about wheels 使用 HTML Tidy 代码。

        3
  •  1
  •   Robert P    15 年前

    你可以这样重新表述这个问题:

    我对一个解析器感兴趣,它可能会采用一个格式错误的 HTML页面 C源,并将其转化为成型良好的 HTML C源在执行某些 XPath查询 编译和链接。你知道吗?

    现在问题可能更明显了:这不容易。如果它是真正的格式错误的HTML,那么您可能需要手工完成这项工作,直到它可以被输入到HTML解析器中。然后,您可以使用这里介绍的任何其他模块来完成这项工作。虽然您不太可能通过编程将原始HTML转换为严格有效的XHTML。