2010-07-18 8 views
23

मैं पाइथन HTMLParser लाइब्रेरी का उपयोग कर एक HTML पृष्ठ से मूल्य प्राप्त करने का प्रयास कर रहा हूं। मूल्य मैं की पकड़ पाने के लिए इस HTML तत्व के भीतर है:मैं एक विशिष्ट div टैग से डेटा निकालने के लिए पाइथन HTMLParser लाइब्रेरी का उपयोग कैसे कर सकता हूं?

... 
<div id="remository">20</div> 
... 

यह मेरा HTMLParser वर्ग अब तक है:

class LinksParser(HTMLParser.HTMLParser): 
    def __init__(self): 
    HTMLParser.HTMLParser.__init__(self) 
    self.seen = {} 

    def handle_starttag(self, tag, attributes): 
    if tag != 'div': return 
    for name, value in attributes: 
    if name == 'id' and value == 'remository': 
     #print value 
     return 

    def handle_data(self, data): 
    print data 


p = LinksParser() 
f = urllib.urlopen("http://domain.com/somepage.html") 
html = f.read() 
p.feed(html) 
p.close() 

कोई सही दिशा में मुझे बात कर सकते हैं? मैं कक्षा कार्यक्षमता मूल्य 20.

+1

आप HTML पार्स की एक बहुत कुछ कर रहे हैं, तो कोशिश [ब्यूटीफुल सूप] (http://www.crummy.com/software/BeautifulSoup/)। – zvone

+3

क्या पुस्तकालय एक पायथन std पुस्तकालय के रूप में शामिल है? मैं इसे पार कर गया हूं लेकिन HTMLParser के साथ चिपकने का फैसला किया है। – Martin

+0

@zvone एचटीएमएल पार्सिंग के लिए सुंदर सूप बेहतर क्यों है? क्या यह अभी भी एक अनुशंसित मॉड्यूल है? धन्यवाद। –

उत्तर

44
class LinksParser(HTMLParser.HTMLParser): 
    def __init__(self): 
    HTMLParser.HTMLParser.__init__(self) 
    self.recording = 0 
    self.data = [] 

    def handle_starttag(self, tag, attributes): 
    if tag != 'div': 
     return 
    if self.recording: 
     self.recording += 1 
     return 
    for name, value in attributes: 
     if name == 'id' and value == 'remository': 
     break 
    else: 
     return 
    self.recording = 1 

    def handle_endtag(self, tag): 
    if tag == 'div' and self.recording: 
     self.recording -= 1 

    def handle_data(self, data): 
    if self.recording: 
     self.data.append(data) 

self.recording मायने रखता है एक "ट्रिगर" से शुरू नेस्टेड div टैग की संख्या प्राप्त करना चाहते हैं। जब हम एक ट्रिगरिंग टैग में निहित उप-पेड़ में होते हैं, तो हम self.data में डेटा जमा करते हैं।

पार्स के अंत में डेटा self.data में छोड़ा गया है (स्ट्रिंग्स की एक सूची, संभवतया रिक्त अगर कोई ट्रिगरिंग टैग पूरा नहीं हुआ हो)। कक्षा के बाहर से आपका कोड पार्स के अंत में सीधे उदाहरण से सूची तक पहुंच सकता है, या आप अपने लक्ष्य के आधार पर उद्देश्य के लिए उपयुक्त एक्सेसर विधियां जोड़ सकते हैं।

वर्ग आसानी से उपरोक्त कोड, 'div', 'id' में देखा निरंतर शाब्दिक तार के एवज में, का उपयोग करके थोड़ा अधिक सामान्य बना हो सकता है, और 'remository', उदाहरण के गुण self.tag, self.attname और self.attvalue, तर्क से __init__ द्वारा निर्धारित इसे पारित किया - मैंने मुख्य बिंदुओं को अस्पष्ट करने से बचने के लिए ऊपर दिए गए कोड में सस्ता सामान्यीकरण चरण से बचने के लिए (नेस्टेड टैग की गिनती का ट्रैक रखें और रिकॉर्डिंग स्थिति सक्रिय होने पर डेटा को डेटा में जमा करें)।

+1

धन्यवाद एलेक्स, वह कोड पूरी तरह से काम करता है (इस पंक्ति के अलावा "अगर टैग == div और self.recording:" - div एक स्ट्रिंग होना चाहिए)। एक मूल्य लौटने वाले वर्ग द्वारा मेरा मतलब वास्तव में वर्णन किया गया था, कक्षा के भीतर एक कार्य आवश्यक मूल्य वापस करने के लिए। या मैं आसानी से 'डेटा' चर का उपयोग कर सकता हूं। मेरे पास जो शब्द था वह मुझे संभव समाधानों का परीक्षण करने का कुछ अवशेष था :) आपकी मदद के लिए धन्यवाद! नेस्टेड 'div' की गिनती के लिए – Martin

+1

+1 जो पहली बार एचटीएमएल पार्सिंग तक पहुंचने के लिए इतना स्पष्ट नहीं है। –

+0

@ मार्टिन, आपका स्वागत है, और मेरा व्याकुलता स्पॉट करने के लिए +1 - मैं भावी पाठकों के लिए अधिक उपयोगीता के लिए अब (div 'div' उद्धरण और उस निर्देश और टिप्पणी को हटाएं) को ठीक करने के लिए संपादित कर दूंगा। –

4

लाइन 3 पर

HTMLParser.HTMLParser.__init__(self)

लिटिल सुधार यह होना चाहिए

HTMLParser.__init__(self)

हालांकि

import urllib2 

from HTMLParser import HTMLParser 

class MyHTMLParser(HTMLParser): 

    def __init__(self): 
    HTMLParser.__init__(self) 
    self.recording = 0 
    self.data = [] 
    def handle_starttag(self, tag, attrs): 
    if tag == 'required_tag': 
     for name, value in attrs: 
     if name == 'somename' and value == 'somevale': 
      print name, value 
      print "Encountered the beginning of a %s tag" % tag 
      self.recording = 1 


    def handle_endtag(self, tag): 
    if tag == 'required_tag': 
     self.recording -=1 
     print "Encountered the end of a %s tag" % tag 

    def handle_data(self, data): 
    if self.recording: 
     self.data.append(data) 

p = MyHTMLParser() 
f = urllib2.urlopen('http://www.someurl.com') 
html = f.read() 
p.feed(html) 
print p.data 
p.close() 

`

+०१२३५१६४१० मेरे लिए काम किया निम्नलिखित
+3

असल में आप ऐसा करने में सक्षम हैं क्योंकि आपने 'HTMLParser आयात HTMLParser' से निर्दिष्ट किया है, जो आपको सीधे HTMLParser को कॉल करने की अनुमति देता है। यह दुर्भाग्यपूर्ण है कि दोनों का एक ही नाम है, लेकिन वे दो अलग-अलग संस्थाएं हैं। आप 'HTMLParser आयात HTMLParser से पार्सर' के रूप में कुछ भी कर सकते हैं और फिर बस 'क्लास MyHTMLParser (पार्सर) ' –

22

क्या आपने BeautifulSoup को आजमाया है?

from bs4 import BeautifulSoup 
soup = BeautifulSoup('<div id="remository">20</div>') 
tag=soup.div 
print(tag.string) 

यह आपको आउटपुट पर 20 देता है।

0

यह पूरी तरह से काम करता है:

print (soup.find('the tag').text) 
संबंधित मुद्दे

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