Какая библиотека XML для каких целей? - PullRequest
8 голосов
/ 12 марта 2010

Поиск "python" и "xml" возвращает множество библиотек для объединения этих двух.

Этот список, вероятно, неисправен:

  • xml.dom
  • xml.etree
  • xml.sax
  • xml.parsers.expat
  • PyXML
  • BeautifulSoup
  • HTMLparser
  • htmllib
  • sgmllib

Будьте добры, если кто-то может предложить краткое изложение того, когда и какие использовать и почему.

Ответы [ 4 ]

6 голосов
/ 12 марта 2010

Разделение DOM / SAX является базовым. Это относится не только к питону, поскольку DOM и SAX являются мультиязычными.

DOM : прочитать весь документ в память и манипулировать им. Хорошо для:

  • сложные отношения между тегами в разметке
  • маленькие сложные XML-документы
  • Внимание:
    • Простая в использовании избыточная память

SAX : анализировать документ во время его чтения. Хорошо для:

  • Длинные документы или открытые потоки
  • места, где память является ограничением
  • Внимание:
    • Вам понадобится кодировать анализатор с сохранением состояния, что может быть сложно

BeautifulSoup

Отлично подходит для HTML или не совсем правильно сформированной разметки. Простой в использовании и быстрый. Хорошо подходит для скриншота и т. Д. Он может работать с разметкой, когда на основе XML произойдет ошибка, сообщающая о неправильной разметке.

Большую часть остального я не использовал, но я не думаю, что есть жесткие и быстрые правила о том, когда и какие использовать. Только ваши стандартные соображения: кто будет поддерживать код, какие API вы считаете наиболее простыми в использовании, насколько хорошо они работают и т. Д.

В общем, для базовых потребностей целесообразно использовать стандартные библиотечные модули, поскольку они являются «стандартными» и, следовательно, доступны и хорошо известны. Однако, если вам нужно углубиться во что-то, почти всегда есть новые нестандартные модули с превосходной функциональностью вне стандартной библиотеки.

4 голосов
/ 12 марта 2010

Я нахожу xml.etree существенно достаточным для всего, кроме BeautifulSoup, если мне когда-нибудь понадобится проанализировать неработающий XML (не частая проблема, в отличие от неработающего HTML, с которым BeautifulSoup также помогает и 1005 * - это везде): он имеет разумную поддержку для чтения целых XML-документов в памяти, навигации по ним, их создания, инкрементального анализа больших документов. lxml поддерживает тот же интерфейс и, как правило, быстрее - полезно для повышения производительности, когда вы можете позволить себе устанавливать сторонние расширения Python (например, на App Engine вы не можете - но xml.etree все еще там, так что вы можете запустить точно такой же код). lxml также имеет больше функций и предлагает BeautifulSoup.

В других библиотеках вы упоминаете имитирующие API, разработанные для очень разных языков, и в целом я не вижу причин для того, чтобы включать Python в эти движения. Если у вас есть очень специфические потребности, такие как поддержка xslt, различные виды проверок и т. Д., Возможно, стоит поискать другие библиотеки, но у меня не было таких потребностей в течение длительного времени, поэтому я не в курсе предложения для них.

1 голос
/ 12 марта 2010

Для многих проблем вы можете обойтись с XML. Он имеет главное преимущество, будучи частью стандартной библиотеки. Это означает, что он предварительно установлен почти на каждой системе и что интерфейс будет статическим. Это не самое лучшее или самое быстрое, но оно есть.

Для всего остального есть lxml. В частности, lxml лучше всего подходит для анализа неработающего HTML, xHTML или подозрительных каналов. Он использует libxml2 и libxslt для обработки XPath, XSLT и EXSLT. Учебное пособие понятно, и интерфейс упрощенно прост. Остальные упомянутые библиотеки существуют, потому что lxml не был доступен в его текущей форме.

Это моё мнение.

1 голос
/ 12 марта 2010

Я не особо разбираюсь в XML, но когда мне было нужно, с lxml работать было приятно, и, по-видимому, он довольно быстр. API дерева элементов очень хорош в объектно-ориентированной настройке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...