Python xml.dom и плохой XML
-
18-09-2019 - |
Вопрос
Я пытаюсь извлечь некоторые данные с различных HTML-страниц, используя программу python.К сожалению, некоторые из этих страниц содержат введенные пользователем данные, которые иногда содержат "незначительные" ошибки, а именно несоответствие тегов.
Есть ли хороший способ заставить python's xml.dom попытаться исправить ошибки или что-то в этом роде?В качестве альтернативы, есть ли лучший способ извлечь данные из HTML-страниц, которые могут содержать ошибки?
Решение
Вы могли бы использовать HTML Аккуратный чтобы привести себя в порядок, или Прекрасный Суп для разбора.Возможно, вам придется сохранить результат во временный файл, но это должно сработать.
Ваше здоровье,
Другие советы
Раньше я использовал BeautifulSoup для таких задач, но теперь я перешел на HTML5lib (http://code.google.com/p/html5lib/) , который хорошо работает во многих случаях, когда BeautifulSoup терпит неудачу
другой альтернативой является использование "Элементарный Суп" (http://effbot.org/zone/element-soup.htm) который является оберткой для Красивого Супа с использованием ElementTree
lxml выполняет достойную работу по разбору недопустимого HTML.
Согласно их документации Прекрасный Суп и html5lib иногда производительность улучшается в зависимости от входных данных.С помощью lxml вы можете выбрать, какой анализатор использовать, и получить к ним доступ через унифицированный API.
Если jython для вас приемлем, tagsoup очень хорош в разборе мусора - если это так, я обнаружил, что библиотеки jdom намного проще в использовании, чем другие альтернативы xml.
Это фрагмент демонстрационного макета, предназначенного для очистки экрана из tfl journey planner:
private Document getRoutePage(HashMap params) throws Exception { String uri = "http://journeyplanner.tfl.gov.uk/bcl/XSLT_TRIP_REQUEST2"; HttpWrapper hw = new HttpWrapper(); String page = hw.urlEncPost(uri, params); SAXBuilder builder = new SAXBuilder("org.ccil.cowan.tagsoup.Parser"); Reader pageReader = new StringReader(page); return builder.build(pageReader); }