lxml.etree.XMLSyntaxError: htmlParseEntityRef: ожидая ';' - PullRequest
3 голосов
/ 29 декабря 2011

Я пытаюсь выяснить API Python lxml, но сталкиваюсь с особой проблемой. Я установил следующие версии библиотеки:

  • libxml2: 2.7.8
  • libxslt: 1.1.26

Когда я запускаю следующий код:

html = open('file.html', 'r')
context = etree.iterparse(StringIO(html), events=("start", "end"), html='true')
for event, element in context:
    #do stuff

РЕДАКТИРОВАТЬ:

Оказывается, это ошибка синтаксического анализа. Я переместил HTML в файл (показано ниже)

<html>
    <head></head>
    <body>
        <table>
            <tr>
                <td>image</td>
                <a href="relative.phtml?with=querystring&blah=blah">blah\n(blah)</a></td>
                <td>   35   </td>
                <td>   28   </td>
                <td><b>-7</b></td>
                <td>   
                23,000    </td>
                <td>   373,000   </td>
                <td>   644,000   </td>
                <td>+72.65%</td>
            </tr>
            <tr>
                <td>image</td>
                <td><a href="relative.phtml?with=querystring&blah=blah">blah\n(blah)</a></td>
                <td>   35   </td>
                <td>   28   </td>
                <td><b>-7</b></td>
                <td>   
                23,000    </td>
                <td>   373,000   </td>
                <td>   644,000   </td>
                <td>+72.65%</td>
            </tr>
        </table>
    </body>
</html>

Теперь я получаю эту ошибку:

для события, элемент в контексте:

Файл "iterparse.pxi", строка 515, в lxml.etree.iterparse. следующий (src / lxml / lxml.etree.c: 86484) Файл "parser.pxi", строка 565, в lxml.etree._raiseParseError (src / lxml / lxml.etree.c: 64084) lxml.etree.XMLSyntaxError: ошибка разбора имени атрибута, строка 1, колонка 12

ОРИГИНАЛЬНАЯ ОШИБКА:

для события, элемент в контексте:

Файл "iterparse.pxi", строка 515, в lxml.etree.iterparse. следующий (src / lxml / lxml.etree.c: 86484) Файл "parser.pxi", строка 565, в lxml.etree._raiseParseError (src / lxml / lxml.etree.c: 64084) lxml.etree.XMLSyntaxError: htmlParseEntityRef: ожидая ';', строка 7, колонка 71

Мне показалось, что я очень внимательно следил за учебником с сайта сайта lxml , поэтому я очень запутался. Может ли это быть проблемой установки?

Ответы [ 2 ]

7 голосов
/ 29 декабря 2011

Проблема в том, что HTML искажен. Чтобы решить эту проблему, вы можете использовать BeautifulSoup (он может анализировать этот HTML) или очистить HTML перед попыткой его проанализировать.

Проблемы, которые я обнаружил:

  • Амперсанд должен быть экранирован как HTML-сущность в ссылках: & => &amp;
  • Закрывающий тег td после первого тега a должен быть удален, так как он не совпадает ни с одним другим открывающим тегом td.
4 голосов
/ 02 января 2012

lxml iterparse не может разобрать битый HTML. Если у вас действительно большой файл или ограничения памяти, вы можете написать свой собственный парсер, как в этот ответ . Но если вам разрешено хранить все дерево в памяти, вы можете использовать lxml.html, что быстрее, чем BeautifulSoup.

...