所以我制作了一个python spider,它从给定的站点获取所有链接,然后打印出一个包含'impressum'
的链接。现在我想创建一个elif
函数,如果在链接中找不到'kontakt'
的链接,则打印出istelf中包含'impressum'
的链接。我现在的代码如下所示:
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.zahnarztpraxis-uwe-krause.de"
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=5)
htmlcontent = page.read()
soup = BeautifulSoup(htmlcontent)
newurlArray = []
for link in br.links(text_regex=re.compile('^((?!IMG).)*$')):
newurl = urlparse.urljoin(link.base_url, link.url)
if newurl not in newurlArray:
newurlArray.append(newurl)
#print newurl
if 'impressum' in newurl:
print newurl
elif 'impressum' not in newurl and 'kontakt' in newurl:
print newurl
尽管有if
elif
循环,我总是在控制台中获得两个链接:
http://www.zahnarztpraxis-uwe-krause.de/pages/kontakt.html
http://www.zahnarztpraxis-uwe-krause.de/pages/impressum.html
但在真实情况下,只有在找不到'impressum'的情况下我才需要第二次使用'kontakt'。
我做错了什么?
答案 0 :(得分:1)
我认为我理解你想要实现的目标,你只想在每页打印其中一个网址;即使页面上也有impressum
,也始终打印kontakt
链接,如果页面上没有impressum
,则打印kontakt
,对吗?
如果是这样,您可以添加一个标记来说明页面上是否有impressum
,从而打印哪个URL,或者填充单个变量并打印出来,如下所示:
myUrl = "" #somewhere at start of processing where it is only set to "" once
#in loop:
if 'impressum' in newurl:
myUrl = newurl
elif not myUrl and 'kontakt' in newurl:
myUrl = newurl
print myUrl #print after entire page has been processed
这是未经测试的,但类似的东西应该起作用
答案 1 :(得分:0)
if 'impressum' in newurl:
print newurl
elif 'kontakt' in newurl:
print 'Not impressum:'
print newurl
我没有看到你用什么方式来区分哪个“如果”案例咳嗽链接,所以试试这个,你会看到是if
或elif
块打印链接。< / p>
正如@Joshua所写,你不需要做“'impressum' not in newurl
”,因为它已在if
块中检查过。
答案 2 :(得分:0)
if 'impressum' in newurl:
print "Impressum:", newurl
elif 'kontakt' in newurl:
print "Kontakt:", newurl
else:
pass // not impressum and not kontakt
如果上面的失败,elif
将只执行它,所以你不需要在那里进行双检查。
修改:
如果您希望蜘蛛在找到链接后停止抓取,请将您的代码更改为:
if 'impressum' in newurl:
print "Impressum:", newurl
break
elif 'kontakt' in newurl:
print "Kontakt:", newurl
break
else:
pass // not impressum and not kontakt
答案 3 :(得分:0)
您会看到这两个链接,因为它们发生在for
循环的单独迭代中。单个if
块仅查看单个网址,而elif
会确保单个网址不会打印两次,以防它同时包含"impressum"
和"kontakt"
。它不会阻止在以后的迭代中打印更多链接。
要实现您想要的功能,首先必须遍历所有链接并在循环后决定要打印什么,因为您希望在任何情况下都优先考虑"impressum"
。在看到所有链接后,您才能知道是否有"impressum"
:
urls = set()
contact_keys = ["impressum", "kontakt"]
found_contact_urls = {}
for link in ...:
new_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
此代码允许将更多后备字符串添加到列表contact_keys
。