求助 python的问题

vivre_1 2011-02-18 10:34:26
import urllib
import HTMLParser
class parselinks(HTMLParser.HTMLParser):
urlText= []
def __int__(self):
HTMLParser.HTMLParser.__init__(self)
def handle_starttag(self,tag,attrs):
if tag == 'a':
for name,value in attrs:
if name == 'href':
self.urlText.append(value)
if __name__=='__main__':
my = parselinks()
j = 0
i = 0
urlText1 = []
my.feed(urllib.urlopen("http://www.yxlink.com/index.html").read())
urlText1 = my.urlText
while i < len(urlText1):
print len(urlText1)
urlText1[i] = "http://www.yxlink.com/"+urlText1[i]
my.urlText=[]
my.feed(urllib.urlopen(urlText1[i]).read())
print len(my.urlText)
j = 0
while j< len(my.urlText):
my.urlText[j] = "http://www.yxlink.com/"+my.urlText[j]
print my.urlText[j]
print my.urlText[j] in urlText1
if my.urlText[j] in urlText1 :
j+=1
print i,j
else :
urlText1.append(str(my.urlText[j]))
j+=1
print i,j
i+=1
print urlText1



求助 为什么
while i < len(urlText1):
print len(urlText1)
urlText1[i] = "http://www.yxlink.com/"+urlText1[i]
my.urlText=[]
my.feed(urllib.urlopen(urlText1[i]).read())
print len(my.urlText)
这边的 print len(my.urlText) 是 0 呢
...全文
91 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
iambic 2011-02-18
  • 打赏
  • 举报
回复
当然是0了。你前面一行写了:
my.urlText=[]
隔了一行打印
print len(my.urlText)
中间又没修改my.urlText,那就是[]。

另外别在代码里写这种urlText,urlText1,名字这么相近,区别度很低,可读性很差,容易出bug。用点有意义的名字。
iambic 2011-02-18
  • 打赏
  • 举报
回复
代码里还有很多:
        links[i] = "http://www.yxlink.com/"+links[i]

其实这样写是不太对的。只有相对路径的url才能直接加,如果是http://开头的url你这样加是不对的。所以我写了一个单独的函数,这个函数不是很完美,但是如果有需要的话可以再改进。因为代码都独立出来了,改起来很容易。

import urllib
import HTMLParser

class LinkParser(HTMLParser.HTMLParser):
def __init__(self):
HTMLParser.HTMLParser.__init__(self)
self.links= []

def handle_starttag(self,tag,attrs):
print self.links
if tag == 'a':
for name,value in attrs:
if name == 'href':
self.links.append(value)

def parseLinks(url):
parser = LinkParser()
parser.feed(urllib.urlopen(url).read())
return parser.links

def completeLink(url):
root = "http://www.yxlink.com"
if url.startswith('http://'):
return url
elif url.startswith('/'):
return root + url
else:
return root + '/' + url

if __name__=='__main__':
j = 0
i = 0
links = map(completeLink, parseLinks("http://www.yxlink.com/index.html"))
while i < len(links):
moreLinks = map(completeLink, parseLinks(links[i]))
print len(moreLinks)
j = 0
while j < len(moreLinks):
print moreLinks[j]
print moreLinks[j] in links
if moreLinks[j] not in links :
links.append(str(moreLinks[j]))
j += 1
print i, j
i += 1
print links


iambic 2011-02-18
  • 打赏
  • 举报
回复
楼主先别着急,我慢慢改你的代码。

这一段代码也不好:
            if moreLinks[j] in links :
j+=1
print i,j
else :
links.append(str(moreLinks[j]))
j+=1
print i,j

改成:
            if moreLinks[j] not in links :
links.append(str(moreLinks[j]))
j += 1
print i, j

iambic 2011-02-18
  • 打赏
  • 举报
回复
哦,不好意思,没看仔细。

先不管你的代码具体的错误,首先,你代码的设计就很糟糕。用了一个parselinks对象,这个对象维护,然后所有的人又都去修改它重设它,这是很糟糕的,一来不好用,二来很容易用错。我先把你这个类重新设计下。
另外,原来的linkparser__init__写的也不对,写成了__int__。也不要用urlText = []这种写法初始化mutable的字段。

这一部分修改过的代码如下(没仔细看原来的代码逻辑,不确定改的对不对-_-):

import urllib
import HTMLParser

class LinkParser(HTMLParser.HTMLParser):
def __init__(self):
HTMLParser.HTMLParser.__init__(self)
self.links= []

def handle_starttag(self,tag,attrs):
print self.links
if tag == 'a':
for name,value in attrs:
if name == 'href':
self.links.append(value)

def parseLinks(url):
parser = LinkParser()
parser.feed(urllib.urlopen(url).read())
return parser.links

if __name__=='__main__':
j = 0
i = 0
links = parseLinks("http://www.yxlink.com/index.html")
while i < len(links):
print len(links)
links[i] = "http://www.yxlink.com/"+links[i]
moreLinks = parseLinks(links[i])
print len(moreLinks)
j = 0
while j< len(moreLinks):
moreLinks[j] = "http://www.yxlink.com/"+moreLinks[j]
print moreLinks[j]
print moreLinks[j] in links
if moreLinks[j] in links :
j+=1
print i,j
else :
links.append(str(moreLinks[j]))
j+=1
print i,j
i+=1
print links

vivre_1 2011-02-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 iambic 的回复:]

当然是0了。你前面一行写了:
my.urlText=[]
隔了一行打印
print len(my.urlText)
中间又没修改my.urlText,那就是[]。

另外别在代码里写这种urlText,urlText1,名字这么相近,区别度很低,可读性很差,容易出bug。用点有意义的名字。
[/Quote]
import urllib
import HTMLParser
import sys
class parselinks(HTMLParser.HTMLParser):
urlText= []
def __int__(self):
HTMLParser.HTMLParser.__init__(self)
def handle_starttag(self,tag,attrs):
if tag == 'a':
for name,value in attrs:
if name == 'href':
self.urlText.append(value)

if __name__=='__main__':
my = parselinks()


a = urllib.urlopen("http://www.yxlink.com/index.html")
my.feed(a.read())
print my.urlText
a = urllib.urlopen("http://www.yxlink.com/support-download.html" )
my.feed(a.read())
print my.urlText


看上面这行代码 重新2次调用的结果是一样的。可实际不一样的啊,问题出在哪
vivre_1 2011-02-18
  • 打赏
  • 举报
回复
my.feed(urllib.urlopen(urlText1[i]).read())


这行代码会给 my.urlText 赋值的。。没传递过去啊。

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧