2012-06-16 16 views
12

में HTMLParser का उपयोग करके मैं वेबसाइटों से डेटा स्क्रैप करने और HTML कोडिंग को अलग करने के लिए HTML पार्सर का उपयोग कर रहा हूं। मैं खूबसूरत सूप जैसे विभिन्न मॉड्यूल से अवगत हूं, लेकिन "बाहरी" मॉड्यूल के आधार पर नहीं जाने का मार्ग नीचे जाने का फैसला किया। Strip HTML from strings in Pythonपायथन 3.2

from HTMLParser import HTMLParser 

class MLStripper(HTMLParser): 
    def __init__(self): 
     self.reset() 
     self.fed = [] 
    def handle_data(self, d): 
     self.fed.append(d) 
    def get_data(self): 
     return ''.join(self.fed) 

def strip_tags(html): 
    s = MLStripper() 
    s.feed(html) 
    return s.get_data() 

यह अजगर 3.1 में काम करता है: वहाँ एक कोड Eloff द्वारा आपूर्ति कोड है। हालांकि, मैंने हाल ही में पायथन 3.2.x में अपग्रेड किया है और पाया है कि मुझे उपरोक्त लिखित HTML पार्सर कोड के संबंध में त्रुटियां मिलती हैं। लाइन के लिए

मेरी पहली त्रुटि अंक:

s.feed(html) 

... और त्रुटि कहते हैं ...

AttributeError: 'MLStripper' object has no attribute 'strict' 

तो, अनुसंधान के एक बिट के बाद, मैं "जोड़ सख्त = सच "शीर्ष पंक्ति के लिए, जिससे यह ...

class MLStripper(HTMLParser, strict=True) 

हालांकि, मैं के नए त्रुटि मिलती है:

TypeError: type() takes 1 or 3 arguments 

देखने के लिए क्या होगा, मैं "स्व" तर्क निकाल दिया है और "सख्त = सच" ... जो त्रुटि छोड़ दिया में छोड़ दिया:

NameError: global name 'self' is not defined 

... और मुझे मिल गया "मैं अनुमानों पर अनुमान लगा रहा हूं" महसूस कर रहा हूं।

मुझे नहीं पता कि class MLStripper(HTMLParser) लाइन में तीसरा तर्क self और strict=True के बाद होगा; शोध ने किसी भी ज्ञान को टॉस नहीं किया।

उत्तर

20

आप HTMLParser उपखंड कर रहे हैं, लेकिन आप इसकी __init__ विधि को कॉल नहीं कर रहे हैं। आप अपने __init__ विधि करने के लिए एक लाइन जोड़ने की जरूरत:

def __init__(self): 
    super().__init__() 
    self.reset() 
    self.fed = [] 

इसके अलावा, अजगर 3 के लिए, आयात लाइन है:

from html.parser import HTMLParser 

इन परिवर्तनों के साथ, एक सरल उदाहरण काम करता है। class लाइन को न बदलें, जो संबंधित नहीं है।

+2

यह पूरी तरह से काम करता है, थॉमस के। बहुत बहुत धन्यवाद! स्क्रिप्ट एक बार फिर से "सुपर() .__ init __()" कोड डालने के साथ पूरी तरह से काम कर रहे हैं। – MilesNielsen

+0

यह विशेषताएँ भी हल करता है विशेषता: 'HTMLTagRemover' ऑब्जेक्ट में कोई विशेषता नहीं है 'convert_charrefs' सुपर() .__ init __() मेरे लिए Python2 में आवश्यक नहीं था लेकिन Python3 में था - धन्यवाद –

संबंधित मुद्दे