如何可以解析,并从不同的HTML生成HTML正常化?(How can I parse and nor

2019-09-30 03:31发布

这是本的扩展问题 。 我试图解析嵌入在Blogger博客的XML备份HTML片段,并与InDesign的标签重新标记它们。

博客不规范的任何职位的HTML和职位可以写在Word中的Windows Live作家,本土Blogger界面,或文本编辑器,导致吨不同形式的HTML。 有些职位没有标记段落,只使用双<br> S IN的段落,其他人之间的实际使用<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.

在Word生成的HTML看起来像这样- http://www.timeatlas.com/mos/images/stories/word_html_tags.png

Answer 1:

Word生成的HTML是相对容易对付。 我只想摆脱所有的标签属性的(除非你所关心的样式)。 这将生活与你相当普通的HTML,你可以再风格。

HTML :: TokeParser ::简单的可以帮助您实现这一相对轻松。

至于其他的东西,这将需要一些试验和错误。 我要更多地考虑的是后来后,如果我能想出聪明。

后来更新:

那么,这里的东西,让我畏缩了一点,但它似乎工作:

#!/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>


Answer 2:

HTML解析器:: ?



Answer 3:

正如我在其他问题说,我喜欢XML ::嫩枝 。 它可以同时处理XML和HTML。



Answer 4:

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使用相同的W3C DOM的JavaScript一样。

作为一个例子,该输入:

<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来翻译......不用担心这个打印表示。



文章来源: How can I parse and normalize HTML from different HTML generators?