2009-12-17 11 views
51

जो मैं कर सकता हूं, उससे पाइथन में दो मुख्य HTML पार्सिंग लाइब्रेरी lxml और BeautifulSoup हैं। मैंने एक प्रोजेक्ट के लिए सुंदर सूप चुना है जिस पर मैं काम कर रहा हूं, लेकिन मैंने सिंटैक्स को सीखने और समझने के लिए थोड़ा आसान खोजने के अलावा इसे किसी विशेष कारण के लिए चुना है। लेकिन मुझे लगता है कि बहुत से लोग एलएक्सएमएल का पक्ष लेते हैं और मैंने सुना है कि एलएक्सएमएल तेज है।पाइथन में एलएसएस पार्सिंग - एलएक्सएमएल या सुंदर सूप? इनमें से कौन सा उद्देश्य किस प्रकार के उद्देश्यों के लिए बेहतर है?

तो मैं सोच रहा हूं कि एक दूसरे के फायदे क्या हैं? मैं lxml का उपयोग कब करना चाहूंगा और जब मैं सुंदर सूप का उपयोग बंद कर दूंगा? क्या विचार करने के लायक कोई अन्य पुस्तकालय हैं?

+0

संभव डुप्लिकेट (http://stackoverflow.com/questions/4967103/beautifulsoup-and-lxml- एचटीएमएल-क्या-पसंद करते हैं) मैंने एक [विस्तृत उत्तर] लिखा है (http://stackoverflow.com/a/19548832/1243926); इसे यहां दोबारा पोस्ट किया गया क्योंकि सवाल डुप्लिकेट है। – osa

+0

क्षमा करें, मेरा मतलब दूसरे को बंद करना था। अब दूसरे को ध्वजांकित किया। मैंने सोचा कि इससे कोई फर्क नहीं पड़ता कि ध्वज को बढ़ाने के लिए, पुराने में या नए में। – osa

उत्तर

22

स्टार्टर्स के लिए, सुंदर सूप सक्रिय रूप से बनाए रखा नहीं गया है, और the author even recommends alternatives जैसे कि lxml।

लिंक किए गए पृष्ठ से हवाला देते हुए:

संस्करण 3.1.0 ब्यूटीफुल सूप के संस्करण 3.0.8 की तुलना में वास्तविक दुनिया एचटीएमएल पर काफी बदतर है। सबसे अधिक सामान्य समस्याएं टैग गलत तरीके से संभाल रही हैं, "विकृत प्रारंभ टैग" त्रुटियां, और "खराब अंत टैग" त्रुटियां। यह पृष्ठ बताता है कि क्या हुआ, समस्या को संबोधित किया जाएगा, और अभी आप क्या कर सकते हैं।

यह पृष्ठ मूल रूप से मार्च 2009 में लिखा गया था तब से, 3.2 श्रृंखला जारी किया गया है, 3.1 श्रृंखला की जगह है, और 4.x श्रृंखला के विकास कार्य चल रहा हो गया है। यह पृष्ठ ऐतिहासिक उद्देश्यों के लिए बने रहेगा।

tl; डॉ

उपयोग 3.2.0 बजाय।

+9

+1 सुंदर सूप के क्षय के बारे में नहीं पता था, जिसे मैं भरोसा करता हूं और पूजा करता हूं। –

+1

ठीक है, एलएक्सएमएल का कहना है कि इसमें अच्छा प्रदर्शन है, जबकि यहां किसी ने कहा कि सुंदर सूप वास्तव में धीमा प्रदर्शन था। ऐसा लगता है कि सभ्य एपीआई है। http://codespeak.net/lxml/performance.html – JohnnySoftware

+17

आईएमएचओ यह भ्रामक है - उस पृष्ठ की सावधानीपूर्वक पढ़ने से पता चलता है कि 'lxml' समस्याग्रस्त संस्करण 3.1.0 के लिए सिर्फ एक विकल्प है, जिसकी समस्या 3.2 में तय की गई थी। 0, और अब 2 महीने पहले जारी किए गए तरीके पर संस्करण 4 भी है - इसलिए मॉड्यूल शायद ही कभी "सक्रिय रूप से बनाए रखा नहीं गया" है। * कृपया उत्तर दें * –

5

मैंने HTML को पार्स करने के लिए बड़ी सफलता के साथ lxml का उपयोग किया है। ऐसा लगता है कि "सूपी" एचटीएमएल को संभालने का भी अच्छा काम है। मैं अत्यधिक अनुशंसा करता हूं।

import unittest 
from StringIO import StringIO 
from lxml import etree 

class TestLxmlStuff(unittest.TestCase): 
    bad_html = """ 
     <html> 
      <head><title>Test!</title></head> 
      <body> 
       <h1>Here's a heading 
       <p>Here's some text 
       <p>And some more text 
       <b>Bold!</b></i> 
       <table> 
        <tr>row 
        <tr><td>test1 
        <td>test2 
        </tr> 
        <tr> 
        <td colspan=2>spanning two 
       </table> 
      </body> 
     </html>""" 

    def test_soup(self): 
     """Test lxml's parsing of really bad HTML""" 
     parser = etree.HTMLParser() 
     tree = etree.parse(StringIO(self.bad_html), parser) 
     self.assertEqual(len(tree.xpath('//tr')), 3) 
     self.assertEqual(len(tree.xpath('//td')), 3) 
     self.assertEqual(len(tree.xpath('//i')), 0) 
     #print(etree.tostring(tree.getroot(), pretty_print=False, method="html")) 

if __name__ == '__main__': 
    unittest.main() 
11

BeautifulSoup का उपयोग न करें, का उपयोग lxml.soupparser तो आप lxml की शक्ति के शीर्ष पर बैठे रहे हैं और कर सकते हैं:

यहाँ एक त्वरित परीक्षण मैं चारों ओर झूठ बोल रही थी कुछ बदसूरत एचटीएमएल से निपटने की कोशिश करना है सुंदर सूप के अच्छे बिट्स का उपयोग करें जो वास्तव में टूटे और क्रैपी एचटीएमएल से निपटने के लिए है।

25

Pyquery पायथन के लिए jQuery चयनकर्ता इंटरफ़ेस प्रदान करता है (हुड के नीचे lxml का उपयोग करके)।

http://pypi.python.org/pypi/pyquery

यह वास्तव में भयानक है, मैं कुछ और अब और उपयोग नहीं करते।

+0

मैं हमेशा इस lib बाहर कोशिश करना चाहता था। दिलचस्प लग रहा है। –

+0

यह बीएस 4 से बेहतर काम करता है। मुझे बीएस 4 के साथ कुछ समस्याएं आई हैं जहां 'निदान' भी काम नहीं करेगा :( – Tjorriemorrie

0

कुछ हद तक पुरानी गति तुलना here पाया जा सकता है, जो स्पष्ट रूप से एलएक्सएमएल की सिफारिश करता है, क्योंकि गति अंतर कठोर प्रतीत होता है।

13

संक्षेप में, lxml को बिजली-तेज उत्पादन-गुणवत्ता वाले एचटीएमएल और एक्सएमएल पार्सर के रूप में स्थित किया गया है, वैसे भी, इसमें सुंदरता की कार्यक्षमता पर वापस आने के लिए soupparser मॉड्यूल भी शामिल है। BeautifulSoup एक व्यक्ति परियोजना है, जो आपको खराब तरीके से बनाए गए एचटीएमएल या एक्सएमएल से डेटा निकालने के लिए समय बचाने के लिए डिज़ाइन की गई है।

lxml documentation कहता है कि दोनों पार्सर्स के पास फायदे और नुकसान हैं। इस कारण से, lxmlsoupparser प्रदान करता है ताकि आप आगे और पीछे स्विच कर सकें। उद्धरण,

सुंदर सूप एक अलग पार्सिंग दृष्टिकोण का उपयोग करता है। यह वास्तविक HTML पार्सर नहीं है लेकिन टैग सूप के माध्यम से गोता लगाने के लिए नियमित अभिव्यक्तियों का उपयोग करता है। यह इसलिए कुछ मामलों में अधिक क्षमाशील और दूसरों में कम अच्छा है। यह असामान्य नहीं है कि lxml/libxml2 पार्स और टूटी हुई एचटीएमएल बेहतर, फिक्स करता है लेकिन सुंदर सूप में एन्कोडिंग पहचान के लिए अत्यधिक समर्थन है। यह बहुत अधिक इनपुट पर निर्भर करता है जो पार्सर बेहतर काम करता है।

अंत वे कह रहे हैं में,

इस पार्सर का उपयोग करने का नकारात्मक पक्ष यह है कि यह है से lxml के HTML पार्सर बहुत धीमी है। तो यदि प्रदर्शन महत्वपूर्ण है, तो आप कुछ मामलों के लिए फॉलबैक के रूप में केवल Soupparser का उपयोग करने पर विचार करने के लिए चाहते हैं।

अगर मैं उन्हें सही ढंग से समझते हैं, इसका मतलब है कि सूप पार्सर --- और अधिक मजबूत है --- यह एक नियमित अभिव्यक्ति का उपयोग करके विकृत टैग की "सूप" के साथ सौदा कर सकते हैं, जबकि lxml और अधिक सरल है और सिर्फ चीजों को पारदर्शी करता है और एक पेड़ बनाता है जैसा आप उम्मीद करेंगे। मुझे लगता है कि के लिए soupparser पर न केवल BeautifulSoup पर भी लागू होता है।

उन्होंने यह भी कैसे, BeautifulSoup की एन्कोडिंग पहचान से लाभ प्राप्त करने, जबकि अभी भी lxml साथ जल्दी से पार्स करने दिखाने:

>>> from BeautifulSoup import UnicodeDammit 

>>> def decode_html(html_string): 
...  converted = UnicodeDammit(html_string, isHTML=True) 
...  if not converted.unicode: 
...   raise UnicodeDecodeError(
...    "Failed to detect encoding, tried [%s]", 
...    ', '.join(converted.triedEncodings)) 
...  # print converted.originalEncoding 
...  return converted.unicode 

>>> root = lxml.html.fromstring(decode_html(tag_soup)) 

(एक ही स्रोत: http://lxml.de/elementsoup.html)।

BeautifulSoup के निर्माता के शब्दों में,

यह है कि! मज़े करो! मैंने हर समय बचाने के लिए सुंदर सूप लिखा था। एक बार जब आप इसका उपयोग कर लेंगे, तो आपको कुछ ही मिनटों में खराब-डिज़ाइन की गई वेबसाइटों से डेटा को घुमाने में सक्षम होना चाहिए। अगर आपको कोई टिप्पणी है, तो समस्याएं चलाएं, या मुझे अपने सूअर सूप का उपयोग करने वाले प्रोजेक्ट के बारे में जानना चाहते हैं तो मुझे ईमेल भेजें।

--Leonard 

Beautiful Soup documentation से उद्धरित।

मुझे उम्मीद है कि यह अब स्पष्ट है। सूप एक शानदार एक व्यक्ति परियोजना है जो आपको खराब तरीके से डिज़ाइन की गई वेबसाइटों से डेटा निकालने के लिए समय बचाने के लिए डिज़ाइन की गई है।लक्ष्य आपको अभी समय बचाने के लिए है, नौकरी पाने के लिए, आपको लंबे समय तक समय बचाने के लिए जरूरी नहीं है, और निश्चित रूप से अपने सॉफ्टवेयर के प्रदर्शन को अनुकूलित नहीं करना है।

इसके अलावा

, lxml website से,

lxml की तुलना में अधिक दो लाख बार अजगर पैकेज सूचकांक से डाउनलोड किया गया है और कई पैकेज वितरण, उदा सीधे भी उपलब्ध है लिनक्स या मैकोज़-एक्स के लिए।

और, Why lxml? से,

सी पुस्तकालयों libxml2 और libxslt विशाल फायदे हैं: ... मानक अनुरूप ... पूर्ण विशेषताओं ... तेजी से। तेजी से! फास्ट! ... lxml एक नया अजगर libxml2 के लिए बंधन और libxslt ...

1

यकीन है कि मैं EHP का प्रयोग करेंगे के लिए है। यह एलएक्सएमएल से तेज है, उपयोग करने के लिए और अधिक सुरुचिपूर्ण और सरल है।

चेक आउट करें। https://github.com/iogf/ehp

<body ><em > foo <font color="red" ></font></em></body> 


from ehp import * 

data = '''<html> <body> <em> Hello world. </em> </body> </html>''' 

html = Html() 
dom = html.feed(data) 

for ind in dom.find('em'): 
    print ind.text()  

आउटपुट:

Hello world. 
[? BeautifulSoup और lxml.html - क्या पसंद करते हैं] की
संबंधित मुद्दे