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

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


#!/usr/bin/env python
# -*- coding: utf-8 -*-
from sgmllib import SGMLParser
import urllib
import urllib2
import socket
socket.setdefaulttimeout(210)

class URLLister(SGMLParser):
def reset(self):
self.url = []
SGMLParser.reset(self)

def start_a(self, attrs):
href = [v for k, v in attrs if k == ‘href’]
if href:
self.url.extend(href)

parser = URLLister()

myurl=’http://www.gjjblog.com’
request = urllib2.Request(myurl) #网页请求
opener = urllib2.build_opener()
page = opener.open(request)

if page.code == 200:
predata = page.read()
parser.feed(predata)
print parser.url # 显示抓取到的url数组

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

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from sgmllib import SGMLParser
import urllib
import urllib2
improt re
import string
import socket
socket.setdefaulttimeout(210)

class URLLister(SGMLParser):
def reset(self):
self.url = []
SGMLParser.reset(self)

def start_a(self, attrs):
href = [v for k, v in attrs if k == ‘href’]
if href:
self.url.extend(href)

# 分析主机头
def fenxiurl(xurl):
aa=[]
xurl=xurl.lower()
str=string.split(xurl,’http://’)
#print str,len(str)
if len(str)>1:
ss=str[1]
str=string.split(ss,’/’)
if len(str)>1:
#print str
if str[0] !=”:
aa.append(‘http://’+str[0])

s1=’http://’
for r in range(len(str)-1):
s1=s1+str[r]+’/’

aa.append(s1)
else:
aa.append(xurl)
aa.append(xurl+’/’)

return aa

# 分析和合成
def ChuLiUrl(furlsz,xx):
newurllist=[]
s=re.compile(‘^http://’)
y=re.compile(‘^/’)
for x in range(len(furlsz)):
ssurl=furlsz[x].lower()

m=s.search(ssurl)
if m:
#print “Yes: “,furlsz[x]
newurllist.append(furlsz[x])
else:
#print “No: “,furlsz[x]
if ssurl.find(‘mailto’)>-1:continue
#if ssurl.find(‘ftp://’)>-1:continue
if ssurl.find(‘://’)>-1:continue
if ssurl.find(‘javascript:’)>-1:continue

n=y.search(ssurl)
if n:
newurllist.append(xx[0]+furlsz[x])
else:
newurllist.append(xx[1]+furlsz[x])

a1=set(newurllist)
a2=[i for i in a1]
return a2

parser = URLLister()

myurl=’http://www.gjjblog.com’
request = urllib2.Request(myurl) #网页请求
opener = urllib2.build_opener()
page = opener.open(request)

if page.code == 200:
predata = page.read()
parser.feed(predata)
urlsz=parser.url # 显示抓取到的url数组

fenxihost=fenxiurl(myurl)
print ChuLiUrl(urlsz,fenxihost)

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

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

关于无聊人

一个无聊人而已
此条目发表在python分类目录。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注