Какие есть хорошие способы для анализа HTML и CSS в Perl? - PullRequest
5 голосов
/ 17 февраля 2011

У меня есть проект, в котором мои входные файлы были XML. Теперь меня просят начать обработку HTML со встроенным CSS, и я хотел бы сделать это максимально аккуратно и с минимальным количеством изменений кода, насколько это возможно. Я использовал XML :: LibXML для разбора файлов XML, но теперь, когда мы переходим на HTML с помощью CSS, я думаю, что мне нужно перейти к чему-то другому. Тем не менее, прежде чем я погрузлюсь в глупые решения, о которых я, скорее всего, пожалею, я хотел бы спросить здесь: что вы, ребята, используете для такого рода задач?

Структуры старого XML и новых входных файлов HTML очень похожи, и оба хранят одну и ту же информацию. HTML использует div вместо текстовых узлов XML и хранит информацию о его стиле в тегах и атрибутах стиля вместо отдельных атрибутов xml.

Пример старого XML:

<text font="TimesNewRoman,BoldItalic" size="11.04" x="59" y="405" w="52"
      h="12" bold="yes" italic="yes" cs="4.6" o_bbox="59,405;52,12"
      o_size="11.04" o_cs="4.6">
Some text
</text>

Пример нового HTML:

<div o="9ka" style="position:absolute;top:145;left:89;x-pdf-top:744;x-pdf-left:60;x-pdf-bottom:732;x-pdf-right:536;">
  <span class="ft19" >
    Some text
  </span></nobr>
</div>

где "ft19" относится к элементу стиля css в верхней части страницы формата:

.ft19{ vertical-align:top;font-size:14px;x-pdf-font-size:14px;
       font-family:Times;color:#000000;x-pdf-color:#000000;font-style:italic;
       x-pdf-letter-spacing:0.83px;}

По сути, все, что мне нужно, - это анализатор, который может считывать стилистические элементы каждого узла как атрибуты, поэтому я мог бы сделать что-то вроде:

my @texts_arr = $page_node->findnodes('text');
my $test_node = $texts_arr[1];
print "node\'s bold value is: " . $text_node->getAttribute('bold');

как я могу сделать с XML. Есть ли что-то подобное для разбора HTML? Я действительно хотел бы убедиться, что я начал это правильно, вместо того, чтобы найти что-то, что делает то, что я хочу, на CPAN, и понял, что через два месяца появился другой модуль, который был намного лучше для того, что я пытаюсь сделать.

Идеи

Ответы [ 2 ]

3 голосов
/ 18 февраля 2011

Базовый, о котором я знаю, это HTML::Parser.

Существует также проект, который работает с ним, Marpa::HTML, который является работой более крупного проекта парсера Marpa, который анализирует любой язык, который может быть описан в BNF, задокументировано в блоге автора , что очень интересно, но гораздо новее и экспериментально.

Я также вижу, что чрезвычайно успешный WWW :: Mechanize использует HTML::TokeParser, и он использует HTML::PullParser, так что это тоже есть.

Если вам нужно что-то еще более общее (и злое), вы можете заняться «написанием» своего собственного, используя что-то вроде Text::Balanced (в котором есть несколько хороших методов для тегов, хотя не уверены в свойствах тегов, хотя ) или даже Regexp::Grammars, но, опять же, это означает несколько изобретать колесо, я бы выбрал эти маршруты только в том случае, если вышеперечисленное не делает то, что вам нужно.

Возможно, я не помог. Возможно, я только что провел для вас поиск литературы, но, возможно, один из них будет работать лучше для вас, чем другие.

Редактировать: еще один парсер для вас, похоже, он может делать то, что вам нужно HTML::Tree. Затем посмотрите на методы, подобные look_down из HTML::Element, чтобы воздействовать на дерево. Я видел пример здесь .

0 голосов
/ 18 февраля 2011

Непонятно - парсинг Perl для целей преобразования в HTML (со встроенным CSS)? Если так, то почему бы не забыть Perl и использовать XSLT, который предназначен для преобразования XML-документов?

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