Как HTML :: Query автозаполнение неверного HTML в Perl 5? - PullRequest
0 голосов
/ 16 мая 2018

У меня неверный код HTML с отсутствующим tr в thead. Несмотря на это, я пытаюсь выбрать элементы этого HTML, используя HTML::Query, но селекторы ведут себя интуитивно понятным.

Это мой код:

#!/usr/bin/env perl

require HTML::Query;
use JSON;

my $q = HTML::Query->new( text => '
<table>
    <thead>
        <th>A</th>
        <th>B</th>
        <th>C</th>
    </thead>
    <tbody>
    <tr>
        <td>E</td>
        <td>F</td>
        <td>G</td>
    </tr>
    </tbody>
</table>
' );

my %data = (
    tr => $q->query('tr')->first->as_trimmed_text,
    tbody => $q->query('tbody')->first->as_trimmed_text
);

print JSON->new->utf8(0)->encode( \%data );

Результат:

{
  "tbody": "",
  "tr": "BC"
}

Конечно, если я использую правильный HTML код с пропущенным tr:

<table>
    <thead>
    <tr>
        <th>A</th>
        <th>B</th>
        <th>C</th>
    </tr>
    </thead>
    <tbody>
    <tr>
        <td>E</td>
        <td>F</td>
        <td>G</td>
    </tr>
    </tbody>
</table>

Затем программа печатает подозрительный интуитивный вывод:

{
  "tr": "ABC",
  "tbody": "EFG"
}

Мои вопросы:

  • почему в первом случае буква A опущена?
  • почему tbody нельзя найти?
  • как HTML::Query относится к недействительным HTML? Это исправлено? Каким образом?

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Я сопровождающий этого пакета.

HTML :: Query предоставляет волшебство селектора в дополнение к возможностям синтаксического анализа, предоставляемым HTML :: Tree. HTML :: Query сам по себе не обеспечивает синтаксического анализа. Ваша проблема с HTML :: Tree, а не с HTML :: Query.

HTML: Дерево в значительной степени предшествует соответствию спецификации. Первоначально он был создан еще тогда, когда IE управлял интернетом (1999) и обрабатывает HTML, основываясь на использовании «реального мира». Он довольно неплохо справляется с обработкой документов HTML 4, но, как вы заметили, есть проблемы с нетрадиционной разметкой, которая в HTML 4 является иным образом допустимой. Для обработки этих крайних случаев нет средств, библиотека не может и не будет их обрабатывать, так как Есть тысячи организаций, которые полагаются на существующую реализацию, чтобы продолжать работать в том виде, в каком она была.

HTML :: Tree неправильно поддерживает HTML5. Автор базовой библиотеки HTML :: TagSet отказывается ее поддерживать и спорит с (или игнорирует) любого, кто предлагает решение или предлагает принять библиотеку. Эта позиция эффективно препятствует ВСЕМ производным проектам правильно обрабатывать HTML5 - HTML :: Query и CSS :: Inliner не являются исключением.

Что касается предложения использовать HTML :: HTML5 :: Parser или «любые другие модули Perl, которые предоставляют HTML-анализатор» - я приветствую исправления. При этом: не существует достаточно поддерживаемых библиотек Perl, которые бы отображали, что сделал HTML :: Tree, поэтому любая такая попытка может потерпеть неудачу, но давайте посмотрим, что вы можете придумать.

0 голосов
/ 16 мая 2018

Я нашел частичный ответ.При добавлении к хэшу %data пары:

html => $q->as_HTML

я вижу недопустимый HTML этот результат:

<html>
    <head></head>
    <body>
        <table>
            <thead></thead>
            <th>A</th>
            <tr>
                <th>B</th>
                <th>C</th>
                <tbody></tbody>
            </tr>
            <tr>
                <td>E</td>
                <td>F</td>
                <td>G</td>
            </tr>
        </table>
    </body>
</html>

Так что я знаю, как преобразуется недопустимый HTML.

На мой взгляд, это можно изменить.Ссылка на созданный номер:

https://github.com/abw/HTML-Query/issues/8

...