Видеть неожиданное поведение при использовании lxml для разбора HTML - PullRequest
0 голосов
/ 05 июня 2018

Я вижу неожиданное поведение при использовании lxml для анализа следующего HTML.Вот мой код Python 3:

    from lxml import etree, html

    s = """
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
      <head>
        <title></title>
      </head>
      <body>
      <strong>ABC</strong>"<" and ">"
      </body>
    </html>
    """

    doc = etree.ElementTree(html.fromstring(s))
    print(etree.tostring(doc, pretty_print=True, encoding="unicode"))

Вот вывод, который я получаю:

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
      <head>
        <title/>
      </head>
      <body>
      <strong>ABC</strong>""
      </body>
    </html>        

Есть что-то, что я пропускаю или делаю неправильно?Или это ошибка в lxml?

1 Ответ

0 голосов
/ 07 июня 2018
  1. Буквальная левая угловая скобка (<) должна быть представлена ​​(экранирована) как &lt;.Неэкранированный <, который не является первым символом фактического тега, например <strong>, прервет синтаксический анализ.

  2. etree.tostring() использует правила XML.Если вы хотите <title></title> вместо <title/> на выходе, используйте html.tostring().

...