2015-01-06 4 views
15

मैं एक वेब स्क्रैपिंग प्रोजेक्ट पर काम कर रहा हूं और गति के साथ समस्याओं में भाग गया हूं। इसे ठीक करने का प्रयास करने के लिए, मैं html.parser के बजाय सुंदर सूप के पार्सर के रूप में lxml का उपयोग करना चाहता हूं। मैं यह कर कर लिया है:डिफ़ॉल्ट रूप से lxml सेट करें सुंदर सूप पार्सर

soup = bs4.BeautifulSoup(html, 'lxml') 

लेकिन मैं बार-बार हर बार जब मैं BeautifulSoup फोन टाइप करने के लिए 'lxml' के लिए नहीं करना चाहती। क्या कोई तरीका है कि मैं अपने प्रोग्राम की शुरुआत में एक बार पार्सर का उपयोग कैसे कर सकता हूं?

+1

'lxml' * *' bs4' में डिफ़ॉल्ट, यह मानते हुए है है आप 'स्थापित lxml'। तो जब तक आप BeautifulSoup3 के साथ काम नहीं कर रहे हैं ... – roippi

+0

मैं बीएस 4 का उपयोग कर रहा हूं, लेकिन मुझे नहीं पता था कि मैं किस पार्सर का उपयोग कर रहा हूं। धन्यवाद! –

उत्तर

12

Specifying the parser to use प्रलेखन पेज के अनुसार:

BeautifulSoup निर्माता को पहले तर्क एक स्ट्रिंग या एक खुला filehandle-मार्कअप आप पार्स चाहते हैं। दूसरा तर्क यह है कि आप मार्कअप को पार्स करना चाहते हैं।

यदि आप कुछ भी निर्दिष्ट नहीं करते हैं, तो आपको सबसे अच्छा HTML पार्सर मिलेगा जो स्थापित है। सुंदर सूप एलएक्सएमएल के पार्सर को सर्वश्रेष्ठ होने के रूप में रैंक करता है, फिर एचटीएमएल 5 एलआईबी, फिर पायथन का अंतर्निर्मित पार्सर।

दूसरे शब्दों में, उसी पाइथन पर्यावरण में बस lxml स्थापित करना इसे डिफ़ॉल्ट पार्सर बनाता है।

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

यदि आप अभी भी पार्सर को स्पष्ट रूप से निर्दिष्ट नहीं करना चाहते हैं, तो कम से कम भविष्य के लिए एक नोट बनाएं या अन्य जो प्रोजेक्ट के रीडमे/दस्तावेज़ीकरण में आपके द्वारा लिखे गए कोड का उपयोग करेंगे, और अपनी परियोजना आवश्यकताओं में lxml सूचीबद्ध करें beautifulsoup4 के साथ।

इसके अलावा: "Explicit is better than implicit."

+0

नोट, बीएस 4 संस्करण 4.5 के साथ।1, जब 'lxml' पार्सर निर्दिष्ट करते हैं और इसे स्थापित नहीं किया जाता है bs4 ** ** ** त्रुटि: bs4.FeatureNotFound: आपके द्वारा अनुरोधित सुविधाओं के साथ एक पेड़ निर्माता नहीं मिला: lxml। क्या आपको एक पार्सर लाइब्रेरी स्थापित करने की आवश्यकता है? – glexey

4

जाहिर accepted answer पहले पर एक नज़र डालें। यह बहुत अच्छा है, और इस तकनीकी के लिए के रूप में:

लेकिन मैं बार-बार प्रकार 'lxml' हर बार जब मैं BeautifulSoup फोन करने के लिए नहीं करना चाहती। क्या कोई तरीका है कि मैं अपने प्रोग्राम की शुरुआत पर एक बार पार्सर का उपयोग कैसे कर सकता हूं?

तो मैं समझ गया अपने प्रश्न सही ढंग से, मैं दो दृष्टिकोण है कि आप कुछ कीस्ट्रोक्स की बचत होगी के बारे में सोच सकते हैं: - एक आवरण समारोह को परिभाषित करें, या - एक आंशिक समारोह बनाएँ।

# V1 - define a wrapper function - most straight-forward. 
import bs4 

def bs_parse(html): 
    return bs4.BeautifulSoup(html, 'lxml') 
# ... 
html = ... 
bs_parse(html) 

या आप दिखावा की तरह महसूस करता है, तो ...

import bs4 
from functools import partial 
bs_parse = partial(bs4.BeautifulSoup, features='lxml') 
# ... 
html = ... 
bs_parse(html) 
+0

क्या आप 'आंशिक' काम करने के तरीके के बारे में स्पष्टीकरण जोड़ सकते हैं? क्या रैपर फ़ंक्शन पर इसका उपयोग करने के कोई फायदे हैं? – r3robertson

+1

@ r3robertson यहां आंशिक कार्यों के लिए अच्छा प्रलेखन है: https://docs.python.org/2/library/functools.html#functools.partial ऐसा लगता है कि आंशिक दोनों हुड के नीचे धीमे और अधिक जटिल हैं एक रैपर की तुलना में, लेकिन एक बार इसे लागू करने के बाद, इसका उपयोग करना आसान है। आंशिक कार्य गणितीय दृष्टिकोण से बेहतर शब्द की कमी के लिए साफ हैं। अन्य भाषाओं में यह है और इसे कुछ लोगों द्वारा कार्यात्मक प्रोग्रामिंग का अच्छा उपयोग माना जाता है, लेकिन आप गति और अतिरिक्त आयात के मामले में कीमत का भुगतान करते हैं। मैं अभी भी आंशिक कार्यों का उपयोग करता हूं क्योंकि वे मजेदार हैं। – Leonid