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

如何从不同的HTML生成器解析和规范化HTML?

  •  1
  • Andrew  · 技术社区  · 15 年前

    这是这个的扩展 question .我正在尝试解析嵌入在博客XML备份中的HTML片段,并用InDesign标记重新标记它们。

    Blogger不标准化其任何文章的HTML,这些文章可以用Word、Windows Live Writer、本地Blogger界面或文本编辑器编写,从而产生大量不同形式的HTML。有些文章不标记段落,只使用双精度 <br> 段与段之间的s其他使用实际值 <p> 标签。

    解析这种不标准的标签聚集的最好方法是什么?

    另外,每一篇文章都不是一个完整的HTML文件——只是一个插入到模板中的代码片段,这意味着没有可解析的整体HTML结构。( <html><body></body></html> 等等)这对XML/HTML解析有什么影响吗?

    以下是一些可能的示例,主要是标准HTML,缺少段落:

    This is a section of a blog post. It has <a href="#">links</a> and lists and stuff. Weee....
    <br>
    <br>
    Here's a list
    <br/>
    <br />
    <ul><li>Item 1</li><li>Item 2</li><ul>
    And another paragraph here...
    <br>
    <br/>
    Etc.
    

    HTML这个词看起来像这样- http://www.timeatlas.com/mos/images/stories/word_html_tags.png

    4 回复  |  直到 15 年前
        1
  •  2
  •   Sinan Ünür    15 年前

    Word生成的HTML相对容易处理。我只需要去掉所有的标签属性(除非你关心样式)。这将使您能够使用相当简单的HTML,然后您可以对其进行样式设置。

    HTML::TokeParser::Simple 有助于减轻疼痛。

    至于其他的事情,那将需要一些尝试和错误。如果我能想出一些聪明的东西,我会更多地考虑这个问题,稍后再发表。

    后期更新:

    好吧,这有点让我有点畏缩,但它似乎起作用了:

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    use File::Slurp;
    use Text::Markdown qw( markdown );
    
    my $html = read_file \*DATA;
    
    $html =~ s{(?:<br(:? ?/)*>)}{\n\n}g;
    
    print markdown( $html );
    
    __DATA__
    This is a section of a blog post. It has <a href="#">links</a> and lists and stuff. Weee....
    <br>
    <br>
    Here's a list
    <br/>
    <br />
    <ul><li>Item 1</li><li>Item 2</li></ul>
    And another paragraph here...
    <br>
    <br/>
    

    输出:

    <p>This is a section of a blog post. It has <a href="#">links</a> and lists and
    stuff. Weee....</p>
    
    <p>Here's a list</p>
    
    <ul><li>Item 1</li><li>Item 2</li></ul>
    
    <p>And another paragraph here...</p>
    
        2
  •  3
  •   drdaeman    15 年前
        3
  •  2
  •   Chas. Owens    15 年前

    正如我在另一个问题中所说,我喜欢 XML::Twig . 它可以同时处理XML和HTML。

        4
  •  0
  •   jrockway    15 年前

    fwiw,我倾向于使用xml::libxml来满足我所有的xml和html需求。下面是一行代码,它将把一行“坏”的HTML转换成格式良好的XHTML文档:

    perl -MXML::LibXML -ne 'my $p = XML::LibXML->new->parse_html_string($_); print $p->toString'
    

    在您的示例中,您可能希望使用DOM来发出具有正确标记的新文档。这很简单;xml::libxml使用与javascript相同的W3C DOM。

    例如,此输入:

    <p>Foo<p>Bar<br>Baz!
    

    转换为:

    <?xml version="1.0" standalone="yes"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
    <html><body><p>Foo</p><p>Bar<br/>Baz!
    </p></body></html>
    

    这可能是你想要的,记住,使用dom来翻译…别担心这个印刷品。