Python用SGMLParser抓取网页连接的改进

在网上看见用Python用SGMLParser抓取网页连接的大部分都是用以下代码:

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. from sgmllib import SGMLParser
  4. import urllib
  5. import urllib2
  6. import socket
  7. socket.setdefaulttimeout(210)
  8.  
  9. class URLLister(SGMLParser):
  10.   def reset(self):
  11.     self.url = []
  12.     SGMLParser.reset(self)
  13.  
  14.   def start_a(self, attrs):
  15.     href = [v for k, v in attrs if k == 'href']
  16.     if href:
  17.       self.url.extend(href)
  18.  
  19. parser = URLLister()
  20.  
  21. myurl='http://www.gjjblog.com'
  22. request = urllib2.Request(myurl)  #网页请求
  23. opener = urllib2.build_opener()
  24. page = opener.open(request)
  25.  
  26. if page.code == 200:
  27.      predata = page.read() 
  28.      parser.feed(predata)
  29.      print parser.url # 显示抓取到的url数组

但这程序抓取到的网页连接路径有些是没有包含http://的网页路径,那现在就要需要进一部处理改进了, 我增加了一些函数,改成以下:

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. from sgmllib import SGMLParser
  4. import urllib
  5. import urllib2
  6. improt re
  7. import string
  8. import socket
  9. socket.setdefaulttimeout(210)
  10.  
  11. class URLLister(SGMLParser):
  12.   def reset(self):
  13.     self.url = []
  14.     SGMLParser.reset(self)
  15.  
  16.   def start_a(self, attrs):
  17.     href = [v for k, v in attrs if k == 'href']
  18.     if href:
  19.       self.url.extend(href)
  20.  
  21. # 分析主机头
  22. def fenxiurl(xurl):
  23.   aa=[]
  24.   xurl=xurl.lower()
  25.   str=string.split(xurl,'http://')
  26.   #print str,len(str)
  27.   if len(str)>1:
  28.     ss=str[1]
  29.     str=string.split(ss,'/')
  30.     if len(str)>1:
  31.       #print str
  32.       if str[0] !='':
  33.         aa.append('http://'+str[0])
  34.  
  35.         s1='http://'
  36.         for r in range(len(str)-1):
  37.           s1=s1+str[r]+'/'
  38.     
  39.         aa.append(s1)
  40.     else:
  41.       aa.append(xurl)
  42.       aa.append(xurl+'/')
  43.  
  44.  
  45.   return aa
  46.  
  47.  
  48. # 分析和合成
  49. def ChuLiUrl(furlsz,xx):
  50.   newurllist=[]
  51.   s=re.compile('^http://')
  52.   y=re.compile('^/')
  53.   for x in range(len(furlsz)):
  54.     ssurl=furlsz[x].lower()
  55.  
  56.     m=s.search(ssurl)
  57.     if m:
  58.       #print "Yes: ",furlsz[x]
  59.       newurllist.append(furlsz[x])
  60.     else:
  61.       #print "No: ",furlsz[x]
  62.       if ssurl.find('mailto')>-1:continue
  63.       #if ssurl.find('ftp://')>-1:continue
  64.       if ssurl.find('://')>-1:continue
  65.       if ssurl.find('javascript:')>-1:continue
  66.       
  67.  
  68.       n=y.search(ssurl)
  69.       if n:
  70. newurllist.append(xx[0]+furlsz[x])
  71.       else:
  72. newurllist.append(xx[1]+furlsz[x])
  73.  
  74.       
  75.  
  76.   a1=set(newurllist)
  77.   a2=[i for i in a1]
  78.   return a2
  79.  
  80.  
  81. parser = URLLister()
  82.  
  83. myurl='http://www.gjjblog.com'
  84. request = urllib2.Request(myurl)  #网页请求
  85. opener = urllib2.build_opener()
  86. page = opener.open(request)
  87.  
  88. if page.code == 200:
  89.      predata = page.read() 
  90.      parser.feed(predata)
  91.      urlsz=parser.url # 显示抓取到的url数组
  92.     
  93.  
  94.      fenxihost=fenxiurl(myurl)
  95.      print ChuLiUrl(urlsz,fenxihost)

现在的连接捉取的连接路径就算完整了,做这个都是为了我写的信息蜘蛛服务啊,不过还是不太完美,因为连接里最后的参数包含有?xxx=/usrl/xxxx的话,以上的函数出来就会出错了,因为现在的分析都是基于/做为分隔符号来分析的,暂时我想不到方法完美的去分析它,先做着这些先,想到什么方法分析再改.

Python用SGMLParser抓取网页连接的改进, 文章写得有点草,初学的菜鸟python, 请大家指教。

Tag:

留言