Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从不同的HTML生成器解析和规范化HTML?_Html_Perl_Parsing - Fatal编程技术网

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

如何从不同的HTML生成器解析和规范化HTML?,html,perl,parsing,Html,Perl,Parsing,这是这个的延伸。我正试图解析嵌入博客的XML备份中的HTML片段,并用InDesign标记重新标记它们 Blogger没有对其任何帖子的HTML进行标准化,帖子可以用Word、Windows Live Writer、本机Blogger界面或文本编辑器编写,从而产生大量不同形式的HTML。一些帖子不标记段落,只在段落之间使用双标记,其他帖子使用实际的标记 解析这种不标准的标记聚合的最佳方法是什么 此外,每篇文章都不是一个完整的HTML文件——只是插入到模板中的一个片段,这意味着没有要解析的整体HT

这是这个的延伸。我正试图解析嵌入博客的XML备份中的HTML片段,并用InDesign标记重新标记它们

Blogger没有对其任何帖子的HTML进行标准化,帖子可以用Word、Windows Live Writer、本机Blogger界面或文本编辑器编写,从而产生大量不同形式的HTML。一些帖子不标记段落,只在段落之间使用双

标记,其他帖子使用实际的
标记

解析这种不标准的标记聚合的最佳方法是什么

此外,每篇文章都不是一个完整的HTML文件——只是插入到模板中的一个片段,这意味着没有要解析的整体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.
这是一篇博文的一部分。它有很多东西和清单。Weee。。。。


这是一张单子

  • 项目1
  • 项目2
    • 这里还有一段。。。


单词HTML看起来像这样-

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

可以让你相对无痛

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

后续更新:

嗯,有件事让我有点畏缩,但似乎奏效了:

#!/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/>
#/usr/bin/perl
严格使用;
使用警告;
使用File::Slurp;
使用Text::Markdown qw(Markdown);
my$html=读取文件\*数据;
$html=~s{(?:)}{\n\n}g;
打印降价($html);
__资料__
这是一篇博文的一部分。它有很多东西和清单。Weee。。。。


这是一张单子

  • 项目1
  • 项目2
    • 这里还有一段。。。

输出:

<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>
这是一篇博文的一部分。它具有和列表以及
东西Weee

这是一张单子

  • 项目1
  • 项目2
    • 这里还有一段


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

可以让你相对无痛

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

后续更新:

嗯,有件事让我有点畏缩,但似乎奏效了:

#!/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/>
#/usr/bin/perl
严格使用;
使用警告;
使用File::Slurp;
使用Text::Markdown qw(Markdown);
my$html=读取文件\*数据;
$html=~s{(?:)}{\n\n}g;
打印降价($html);
__资料__
这是一篇博文的一部分。它有很多东西和清单。Weee。。。。


这是一张单子

  • 项目1
  • 项目2
    • 这里还有一段。。。

输出:

<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>
这是一篇博文的一部分。它具有和列表以及
东西Weee

这是一张单子

  • 项目1
  • 项目2
    • 这里还有一段


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

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

FWIW,我倾向于使用XML::LibXML满足所有XML和HTML需求。下面是一个将一行“坏”HTML转换为格式良好的XHTML文档的单行代码:

perl -MXML::LibXML -ne 'my $p = XML::LibXML->new->parse_html_string($_); print $p->toString'
在您的例子中,您可能希望使用DOM来生成具有正确标记的新文档。这是直截了当的;LibXML使用与JavaScript相同的w3cdom

例如,此输入:

<p>Foo<p>Bar<br>Baz!
FooBar
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>

Foo

酒吧
Baz!


这可能是您想要的,请记住,使用DOM来翻译。。。不要担心这种打印的表示。

FWIW,我倾向于使用XML::LibXML满足我所有的XML和HTML需求。下面是一个将一行“坏”HTML转换为格式良好的XHTML文档的单行代码:

perl -MXML::LibXML -ne 'my $p = XML::LibXML->new->parse_html_string($_); print $p->toString'
在您的例子中,您可能希望使用DOM来生成具有正确标记的新文档。这是直截了当的;LibXML使用与JavaScript相同的w3cdom

例如,此输入:

<p>Foo<p>Bar<br>Baz!
FooBar
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>

Foo

酒吧
Baz!


这可能是您想要的,请记住,使用DOM来翻译。。。不要担心这种打印的表示。

您能发布一个大小合理的最坏情况输入片段吗?使用正确的模块,HTML解析很容易。你真的在问你该如何使它正常化吗?是的。在这一点上,有4-5种不同样式的HTML可以通过,所以我想知道在遍历DOM之前是否需要先对HTML进行标准化/规范化/整理…你能发布一个大小合理的最坏情况输入片段吗?使用正确的模块,HTML解析很容易。你真的在问你该如何使它正常化吗?是的。目前有4-5种不同样式的HTML可以使用,所以我想知道在遍历DOM之前是否需要先对HTML进行标准化/规范化/整理…它能处理未标记的文本并将其转换为真实的
?这是我主要关心的问题…不,你需要使用Blogger使用的相同算法。这就是为什么我要使用XML::LibXML,它对修复HTML文档有明确的支持。它能处理未标记的文本并将其转换为真实的
?这是我最关心的…不,你需要使用