2010-03-12 19 views
8

Tìm kiếm "python" và "xml" trả về nhiều thư viện khác nhau để kết hợp cả hai.Thư viện XML nào cho mục đích gì?

này danh sách có thể bị lỗi:

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

Được tốt đẹp nếu ai đó có thể cung cấp một bản tóm tắt nhanh chóng khi sử dụng đó, và tại sao.

+0

Tôi đã đi với súp đẹp vào dịp đó khi những người khác đã được pedantic về đầu vào; một cái gì đó tôi đã không kiểm soát. –

+0

Từ năng suất của nhà phát triển và dễ sử dụng, tôi đã có trải nghiệm tuyệt vời với 'BeautifulSoup'. Anaconda python tàu với nó. – arun

Trả lời

7

Phân chia DOM/SAX là cơ bản. Nó không chỉ áp dụng cho python vì DOM và SAX là ngôn ngữ chéo.

DOM: đọc toàn bộ tài liệu vào bộ nhớ và thao tác. Tốt cho:

  • mối quan hệ phức tạp giữa các thẻ trong đánh dấu
  • nhỏ tài liệu XML phức tạp
  • Lưu ý:
    • Dễ sử dụng quá nhiều bộ nhớ

SAX: phân tích cú pháp t anh ấy ghi lại trong khi bạn đọc nó. Tốt cho:

  • văn bản dài hoặc suối mở kết thúc
  • nơi bộ nhớ là một hạn chế
  • Lưu ý:
    • Bạn sẽ cần phải mã hóa một phân tích cú pháp trạng thái, mà có thể được khôn lanh

beautifulsoup:

Tuyệt vời cho đánh dấu HTML hoặc không được tạo đúng. Dễ sử dụng và nhanh chóng. Tốt cho cạo màn hình, vv Nó có thể làm việc với đánh dấu, nơi những người dựa trên XML sẽ chỉ thông qua một lỗi nói rằng đánh dấu là không chính xác.

Phần lớn phần còn lại tôi chưa sử dụng, nhưng tôi không nghĩ rằng có những quy tắc khó và nhanh về thời điểm sử dụng. Chỉ những cân nhắc tiêu chuẩn của bạn: ai sẽ duy trì mã, API nào bạn thấy dễ sử dụng nhất, chúng hoạt động tốt như thế nào, v.v.

Nói chung, đối với các nhu cầu cơ bản, bạn nên sử dụng các mô-đun thư viện chuẩn vì chúng là "chuẩn" và do đó có sẵn và nổi tiếng.Tuy nhiên, nếu bạn cần đào sâu vào một thứ gì đó, hầu như luôn có các mô-đun không chuẩn mới hơn với chức năng vượt trội bên ngoài thư viện chuẩn.

+0

Đến với bài viết hay này với một số ví dụ về elementtree tốt sử dụng cả hai kiểu phân tích cú pháp: http://www.doughellmann.com/PyMOTW/xml/etree/ElementTree/parse.html –

+0

pymotw liên kết của bạn có rất nhiều ví dụ hay về api tiêu chuẩn. nó thực sự được gọi là 'mô-đun python trong tuần'. – n611x007

1

Tôi không làm gì nhiều với XML, nhưng khi tôi cần, lxml là một niềm vui để làm việc và dường như khá nhanh. API cây phần tử rất đẹp trong một thiết lập hướng đối tượng.

4

tôi thấy xml.etree về cơ bản đủ cho tất cả mọi thứ, trừ BeautifulSoup nếu tôi cần phải phân tích chia XML (không phải là một vấn đề phổ biến, khác với tấm HTML, mà BeautifulSoup cũng giúp và ở khắp mọi nơi): nó có hỗ trợ hợp lý để đọc toàn bộ tài liệu XML trong bộ nhớ, điều hướng chúng, tạo chúng, phân tích từng bước các tài liệu lớn. lxml hỗ trợ giao diện tương tự và thường nhanh hơn - hữu ích để đẩy hiệu suất khi bạn có thể đủ khả năng cài đặt các tiện ích mở rộng của bên thứ ba (ví dụ: trên App Engine bạn không thể - nhưng xml.etree vẫn còn ở đó, vì vậy bạn có thể chạy chính xác cùng một mã). lxml cũng có nhiều tính năng hơn và cũng cung cấp cho BeautifulSoup.

Các libs khác bạn đề cập đến các API bắt chước được thiết kế cho các ngôn ngữ rất khác nhau, và nói chung tôi không thấy lý do nào để mâu thuẫn với Python vào các vòng quay đó. Nếu bạn có nhu cầu rất cụ thể như hỗ trợ cho xslt, các loại xác nhận hợp lệ, v.v., có thể đáng để bạn tìm kiếm các thư viện khác, nhưng tôi không có nhu cầu như vậy trong một thời gian dài vì vậy tôi không phải là hiện tại dịch vụ cho họ.

1

Đối với nhiều vấn đề bạn có thể gặp phải với xml. Nó có lợi thế lớn là một phần của thư viện chuẩn. Điều này có nghĩa là nó được cài đặt sẵn trên hầu hết mọi hệ thống và giao diện sẽ tĩnh. Nó không phải là tốt nhất, hay là nhanh nhất, nhưng nó ở đó.

Đối với mọi thứ khác, có lxml. Cụ thể, lxml là cách tốt nhất để phân tích cú pháp nguồn cấp dữ liệu HTML, xHTML hoặc nghi ngờ bị hỏng. Nó sử dụng libxml2 và libxslt để xử lý XPath, XSLT và EXSLT. Hướng dẫn này rõ ràng và giao diện đơn giản về phía trước. Phần còn lại của các thư viện được đề cập tồn tại vì lxml không có sẵn ở dạng hiện tại của nó.

Đây là ý kiến ​​của tôi.

Các vấn đề liên quan