Как я могу разобрать и нормализовать HTML из разных генераторов HTML? - PullRequest
1 голос
/ 11 июня 2009

Это расширение этого вопроса . Я пытаюсь проанализировать фрагменты HTML, встроенные в резервную копию XML блога Blogger, и повторно пометить их тегами InDesign.

Blogger не стандартизирует HTML для каких-либо своих сообщений, и сообщения могут быть написаны в Word, Windows Live Writer, родном интерфейсе Blogger или текстовых редакторах, что приводит к множеству различных форм HTML. Некоторые сообщения не отмечают абзацы и используют только двойные <br> s между абзацами - другие используют фактические теги <p>.

Как лучше всего анализировать это нестандартное скопление тегов?

Кроме того, каждый пост не является полным HTML-файлом - это просто фрагмент, который вставляется в шаблон & mdash; это означает, что нет общей структуры 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 ]

3 голосов
/ 11 июня 2009
2 голосов
/ 11 июня 2009

Как я уже сказал в другом вопросе, мне нравится XML :: Twig . Он может обрабатывать как XML, так и HTML.

2 голосов
/ 11 июня 2009

HTML, сгенерированный Word, относительно прост в обращении. Я бы просто избавился от всех атрибутов тега (если вы не заботитесь о стилях). Это дало бы вам достаточно простого 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>
0 голосов
/ 12 июня 2009

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 для перевода ... не беспокойтесь об этом печатном представлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...