2011-12-13 55 views
3

我想用Python HTMLParser解析一个网页。我想获取标签的内容,但我不知道如何去做。这是我到目前为止的代码:Python和HTMLParser.handle_data() - 如何从标签获取数据?

import urllib.request 
from html.parser import HTMLParser 

class MyHTMLParser(HTMLParser): 
    def handle_data(self, data): 
     print("Encountered some data:", data) 


url = "website" 
page = urllib.request.urlopen(url).read() 

parser = MyHTMLParser(strict=False) 
parser.feed(str(page)) 

如果我理解正确的话,我可以使用handle_data()函数来获取标签之间的数据。如何指定从哪个标签获取数据?我如何获取数据?

+4

我建议你使用[BeautifulSoup](http://www.crummy.com/software/BeautifulSoup/),因为它有一个非常友好的界面。 – jcollado

+0

不仅仅是因为友好的界面,它更容易理解HTML格式的错误/不正确的HTML格式,你会在狂放的网页上看到它。 – babbageclunk

+0

我试过BeautifulSoup。我解析的页面使它窒息。即使BeautifulSoup不起作用,你怎么做? :) – user1049697

回答

0
html_code = urllib2.urlopen("xxx") 
html_code_list = html_code.readlines() 
data = "" 
for line in html_code_list: 
    line = line.strip() 

    if line.startswith("<h2"): 
     data = data+line 

hp = MyHTMLParser() 
hp.feed(data) 
hp.close() 

因此,你可以从H2标签中提取数据,希望它可以帮助

+3

不好!不要用这个解析HTML! – Dan

+0

什么是解析HTML的最佳方式?我试过HTMLParser,解析速度很慢 – Yanan

1

我没有时间格式化/打扫一下,但我就是这样平时做:

 class HTMLParse(HTMLParser.HTMLParser): 
      def handle_starttag(self, tag, attr): 
       if tag.lower() == "a": 
        for item in attr: 
         #print item 
         if item[0].lower() == "href": 
          path = urlparse.urlparse(item[1]).path 
          ext = os.path.splitext(path)[1] 
          if ext.lower() in (".jpeg", ".jpg", ".png", 
               ".bmp"): 
           print "Found: "+ item[1] 
0
class HTMLParse(HTMLParser.HTMLParser): 
    def handle_starttag(self, tag, attrs): 
     if tag =="h2": 
      self.recordh2 = True 
    def handle_endtag(self, tag, attrs): 
     if tag =="h2": 
      self.recordh2 = False 
    def handle_data(self, data): 
     if self.recordh2 == True: 
      #do your work here 
+0

有没有办法仅仅检索标签之间的数据?我的意思是,每个人都建议使用BS或lxml,但是如果可能的话,我想尝试使用HTMLParser,因为我的应用程序非常简单(并且我希望学习在命令行界面中进行简单的操作) ... –