应该是把getInternalLinks(),getExternalLinks()当类处理了。怎么样才能让他不当类处理呢。又不想另外把上面那两个函数单独写一个py文件再在开始import进来。
#获取页面所有内链的列表
def getInternalLinks(bsObj,includeUrl):
includeUrl = urlparse(includeUrl).scheme + '://' + urlparse(includeUrl).netloc
internalLinks = []
#找出所有以'/'开头的链接
for link in bsObj.findAll('a',href = re.compile('^(/|.*)'+includeUrl+')')):
if link.attrs['href'] is not None:
if link.attrs['href'] not in internalLinks: #不要重复的
if link.attrs['href'].startwith('/'):
internalLinks.append(includeUrl + link.attrs['href']) #相对路径的内链
else:
internalLinks.append(link.attrs['href']) #绝对路径的内链
return internalLinks
#获取页面所有外链的列表
def getExternalLinks(bsObj,excludeUrl):
externalLinks = []
#找出所有以'http'或'www'开头且不包含当前URL的链接
for link in bsObj.findAll('a',href = re.compile('^(http|www)((?!'+excludeUrl+').)*$')):
if link.attrs['href'] is not None:
if link.attrs['href'] not in externalLinks: #不要重复的
externalLinks.append(link.attrs['href'])
return externalLinks
#随机获取一个外链
def getRandomExternalLink(startingPage):
html = urllib2.urlopen(startingPage)
bsObj = BeautifulSoup(html,features = 'html.parser')
externalLinks = getExternalLinks(bsObj,urlparse(startingPage).netloc)
if len(externalLinks) == 0:
print 'No external links,looking around the site for one'
domain = urlparse(startingPage).scheme + '://' + urlparse(startingPage).netloc
internalLinks = getInternalLinks(bsObj,domain)
return getRandomExternalLink(internalLinks[random.randint(0,len(internalLinks) - 1)])
else:
return externalLinks[random.randint(0,len(externalLinks) - 1)]
4 个解决方案
#1
哪一行报错 ,你把完整的报错信息帖上来看看
#2
报错信息如下(其实就是我说的下面的函数调用上面的函数出错):
Traceback (most recent call last):
File "C:\Python27\Codes\AboutCrawler\TestBS4_06.py", line 67, in <module>
followExternalOnly(url)
File "C:\Python27\Codes\AboutCrawler\TestBS4_06.py", line 62, in followExternalOnly
externalLink = getRandomExternalLink(startingSite)
File "C:\Python27\Codes\AboutCrawler\TestBS4_06.py", line 52, in getRandomExternalLink
externalLinks = getExternalLinks(bsObj,urlparse(startingPage).netloc)
TypeError: 'module' object is not callable
#3
getExternalLinks直接就可以调用,是不是你的参数startingPage有问题
#4
好吧,原来不是函数调用另一个函数的问题。
是urlparse(startingPage)的问题
我import的时候,写的是from urllib2 import urlparse
我一开始以为import进的是urlparse函数,以为和from urllib2 import urlopen一样,可以直接在程序里用urlopen()调用他。
但是看了原文件才知道。实际上是导入了urlparse模块,万万没想到,urlparse类下面还有个同名的urlparse()函数。
所以正确的方法应该是urlparse.urlparse()而不是urlparse()。
是我自己犯糊涂了,还是谢谢上面的大佬了。
是urlparse(startingPage)的问题
我import的时候,写的是from urllib2 import urlparse
我一开始以为import进的是urlparse函数,以为和from urllib2 import urlopen一样,可以直接在程序里用urlopen()调用他。
但是看了原文件才知道。实际上是导入了urlparse模块,万万没想到,urlparse类下面还有个同名的urlparse()函数。
所以正确的方法应该是urlparse.urlparse()而不是urlparse()。
是我自己犯糊涂了,还是谢谢上面的大佬了。
#1
哪一行报错 ,你把完整的报错信息帖上来看看
#2
报错信息如下(其实就是我说的下面的函数调用上面的函数出错):
Traceback (most recent call last):
File "C:\Python27\Codes\AboutCrawler\TestBS4_06.py", line 67, in <module>
followExternalOnly(url)
File "C:\Python27\Codes\AboutCrawler\TestBS4_06.py", line 62, in followExternalOnly
externalLink = getRandomExternalLink(startingSite)
File "C:\Python27\Codes\AboutCrawler\TestBS4_06.py", line 52, in getRandomExternalLink
externalLinks = getExternalLinks(bsObj,urlparse(startingPage).netloc)
TypeError: 'module' object is not callable
#3
getExternalLinks直接就可以调用,是不是你的参数startingPage有问题
#4
好吧,原来不是函数调用另一个函数的问题。
是urlparse(startingPage)的问题
我import的时候,写的是from urllib2 import urlparse
我一开始以为import进的是urlparse函数,以为和from urllib2 import urlopen一样,可以直接在程序里用urlopen()调用他。
但是看了原文件才知道。实际上是导入了urlparse模块,万万没想到,urlparse类下面还有个同名的urlparse()函数。
所以正确的方法应该是urlparse.urlparse()而不是urlparse()。
是我自己犯糊涂了,还是谢谢上面的大佬了。
是urlparse(startingPage)的问题
我import的时候,写的是from urllib2 import urlparse
我一开始以为import进的是urlparse函数,以为和from urllib2 import urlopen一样,可以直接在程序里用urlopen()调用他。
但是看了原文件才知道。实际上是导入了urlparse模块,万万没想到,urlparse类下面还有个同名的urlparse()函数。
所以正确的方法应该是urlparse.urlparse()而不是urlparse()。
是我自己犯糊涂了,还是谢谢上面的大佬了。