所以我制作了一个网络蜘蛛,它扫描给定站点上的所有链接,并且我为他配置了两个条件来检查。
代码:
import urllib
import re
import mechanize
from bs4 import BeautifulSoup
import urlparse
import cookielib
from urlparse import urlsplit
from publicsuffix import PublicSuffixList
url = "http://www.physiotherme.com"
br = mechanize.Browser()
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
br.set_handle_robots(False)
br.set_handle_equiv(False)
br.set_handle_redirect(True)
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
page = br.open(url, timeout=10)
htmlcontent = page.read()
soup = BeautifulSoup(htmlcontent)
urls = set()
contact_keys = ["impressum", "kontakt"]
found_contact_urls = {}
for link in br.links(text_regex=re.compile('^((?!IMG).)*$')):
new_url = urlparse.urljoin(link.base_url, link.url)
urls.add(new_url)
for key in contact_keys:
if key in new_url:
found_contact_urls[key] = new_url
break
for key in contact_keys:
if key in found_contact_urls:
print found_contact_urls[key]
break
else:
print url
break
这个想法是蜘蛛检查集合中的链接,如果他找到其中的链接,'impressum'
它会打印出来,如果没有,他会打印出包含'kontakt'
在其中的链接。
如果这两个链接都没有找到,那么他会打印出主站点的地址。
我正在查看的以下站点 ( http://www.physiotherme.com ) 没有链接,'impressum'
但确实有'kontakt'
word 链接。
但是我的蜘蛛没有打印出那个链接http://www.physiotherme.com/kontakt.html
,他从主站点打印出那个链接,http://www.physiotherme.com
即使那个'kontakt'
链接在我的 url 集中。如果我print urls
结束,我会在集合中看到想要的链接:
set(['http://www.physiotherme.com/sauna.html', 'http://www.physiotherme.com/kontakt.html', 'http://www.physiotherme.com/offen.html'])
所以我不知道我的代码有什么问题。为什么他不打印出来http://www.physiotherme.com/kontakt.html
?
编辑:
刚刚注意到,如果我删除
else:
print url
break
链接kontakt
被打印出来。但这不是我的解决方案,因为在其他具有不同网站的情况下,如果contact_keys
找不到这两个中的任何一个,我想打印主 url..