所以我制作了一个网络蜘蛛,扫描给定网站上的所有链接,我已经为他配置了两个条件。
代码:
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'
的链接。< / p>
如果找不到这两个链接,那么他会打印出主站点的地址。
我正在查看的以下网站(http://www.physiotherme.com)与'impressum'
没有关联,但与'kontakt'
字词有链接。
但是我的蜘蛛没有打印出该链接http://www.physiotherme.com/kontakt.html
,他从主网站http://www.physiotherme.com
打印出一个,即使是'kontakt'
的链接也在我的网址集中。如果我把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
中的那两个,我想打印主网址。
答案 0 :(得分:0)
您的代码逻辑与您的描述不一致。代码的最后一部分应该是:
for link in br.links(text_regex=re.compile('^((?!IMG).)*$')):
new_url = urlparse.urljoin(link.base_url, link.url)
......
key_found_flag = False
for key in contact_keys:
if key in found_contact_urls.keys():
print found_contact_urls[key]
key_found_flag = True
break
if not key_found_flag:
print url