Разбор плохого XHTML - PullRequest
       20

Разбор плохого XHTML

0 голосов
/ 25 декабря 2018

Мой новый проект заключается в извлечении данных из Глоссария музыкальных терминов Naxos, замечательного ресурса, текстовые данные которого я хочу обработать, и извлечь в базу данных для использования на другом, более простом веб-сайте, который я создам..

Моя единственная проблема - ужасное форматирование XHTML.Проверка W3C XHTML вызывает 318 ошибок и 54 предупреждения.Даже HTML Tidier , который я нашел, не может все это исправить.

Я использую Python 3.67, и страница, которую я анализирую, была ASP.Я тестировал LXML и Python XML модули, но оба не сработали.

Может кто-нибудь предложить какие-либо другие инструменты или модули?Или мне придется использовать какую-то необработанную текстовую манипуляцию (чёрт!)?

Мой код:

LXML:

from lxml import etree

file = open("glossary.asp", "r", encoding="ISO-8859-1")
parsed = etree.parse(file)

Ошибка:

  Traceback (most recent call last):
  File "/media/skuzzyneon/STORE-1/naxos_dict/xslt_test.py", line 4, in <module>
    parsed = etree.parse(file)
  File "src/lxml/etree.pyx", line 3426, in lxml.etree.parse
  File "src/lxml/parser.pxi", line 1861, in lxml.etree._parseDocument
  File "src/lxml/parser.pxi", line 1881, in lxml.etree._parseFilelikeDocument
  File "src/lxml/parser.pxi", line 1776, in lxml.etree._parseDocFromFilelike
  File "src/lxml/parser.pxi", line 1187, in lxml.etree._BaseParser._parseDocFromFilelike
  File "src/lxml/parser.pxi", line 601, in lxml.etree._ParserContext._handleParseResultDoc
  File "src/lxml/parser.pxi", line 711, in lxml.etree._handleParseResult
  File "src/lxml/parser.pxi", line 640, in lxml.etree._raiseParseError
  File "/media/skuzzyneon/STORE-1/naxos_dict/glossary.asp", line 25
lxml.etree.XMLSyntaxError: EntityRef: expecting ';', line 25, column 128
>>> 

Python XML (с использованием проверенного XHTML):

import xml.etree.ElementTree as ET

file = open("tidy.html", "r", encoding="ISO-8859-1")
root = ET.fromstring(file.read())

# Top-level elements
print(root.findall("."))

Ошибка:

  Traceback (most recent call last):
  File "/media/skuzzyneon/STORE-1/naxos_dict/xslt_test.py", line 4, in <module>
    root = ET.fromstring(file.read())
  File "/usr/lib/python3.6/xml/etree/ElementTree.py", line 1314, in XML
    parser.feed(text)
  File "<string>", line None
xml.etree.ElementTree.ParseError: undefined entity: line 526, column 33

1 Ответ

0 голосов
/ 26 декабря 2018

Lxml, вероятно, думает, что вы даете это XML таким образом.Попробуйте это так:

from lxml import html
from cssselect import GenericTranslator, SelectorError

file = open("glossary.asp", "r", encoding="ISO-8859-1")
doc = html.document_fromstring(file.read())
print(doc.cssselect('title')[0].text_content())

Также вместо «HTML Tidiers» просто откройте его в Chrome и скопируйте HTML на панели элементов.

...