我正在尝试制作网页的对象图(边缘是页面之间的“相关”链接)。一旦我得到这个工作,我将创建一个对象字典,其中键作为 URL,这样我就不会创建同一页面的多个对象。
我有一个 Page() 类,内页是一个列表,里面填充了 Page() 类型的对象。我在我的根页面对象上调用函数 root.crawlRelated()。这将填充列表。然后我尝试遍历列表并调用 obj.crawlRelated()。然后,我的目标是在 root.related[] 中为每个对象 Page() 填充其相关页面的列表。
在我正在抓取的网站上,每个页面都有 5 个相关链接,因此经过两代之后,应该有一个具有 5 个相关对象的根,并且每个对象都应该有 5 个相关对象。我遇到的问题是 crawlRelated() 方法将所有对象附加到 root 而不是 root.related 中的相应对象。
from urllib import urlopen
#from bs4 import BeautifulSoup
import re
####################CLASS PAGE######################
class Page():
__title = ""
__link = ""
related = []
__relatedURLs = []
def __init__(self, title, link, relatedURLs):
self.__title = title
self.__link = link
self.__relatedURLs = relatedURLs
def get_attributes(self,key):
return self.__attributes.get(key,None)
def get_relatedURLs(self):
return self.__relatedURLs
def get_title(self):
return self.__title
def crawl(self,url):
webpage = urlopen(url).read()
patFinderTitle = re.compile('<title>(.*)</title>')
patFinderLink = re.compile('<link rel="canonical" href="([^"]*)" />')
patFinderRelated = re.compile('<li><a href="([^"]*)"')
findPatTitle = re.findall(patFinderTitle, webpage)
findPatLink = re.findall(patFinderLink, webpage)
findPatRelated = re.findall(patFinderRelated, webpage)
self.related.append(Page(findPatTitle,findPatLink,findPatRelated))
def crawlRelated(self):
for link in self.__relatedURLs:
self.crawl(link)
print 'crawled related in', self.__title
####################END CLASS######################
print 'doing some work...'
webpage = urlopen('http://medtwice.com/am-i-pregnant/').read()
patFinderTitle = re.compile('<title>(.*)</title>')
patFinderLink = re.compile('<link rel="canonical" href="([^"]*)" />')
patFinderRelated = re.compile('<li><a href="([^"]*)"')
findPatTitle = re.findall(patFinderTitle, webpage)
findPatLink = re.findall(patFinderLink, webpage)
findPatRelated = re.findall(patFinderRelated, webpage)
print 'found the webpage', findPatTitle
root = Page(findPatTitle,findPatLink,findPatRelated)
print 'Now crawling', root.get_relatedURLs()
root.crawlRelated()
print 'done crawling related'
print 'crawling related gen 2...'
i = 0
for rel in root.related:
print 'crawling', rel#.get_title()
#print rel.get_relatedURLs()
rel.crawlRelated()
i += 1
if i > 3:
break
print 'done crawling related gen 2'
print root.related
print len(root.related)
print len(root.related[0].related)
if i > 3: break line 是为了防止由于这个错误而发生的无限循环。
这行代码运行后
print len(root.related)
print len(root.related[0].related)
>> 25
>> 25
我希望它返回
>>5
>>5
我究竟做错了什么?谢谢。