我有一个IP地址的文本文件,每个文件都在自己的行中。下面的脚本将遍历列表并查询站点以查找与IP匹配的域并将其打印到文件。如果每个IP都有结果,这样可以正常工作,但是当网站没有返回域时,我会收到以下错误:BeautifulSoup
无法匹配该属性,并且脚本失败。
AttributeError:' NoneType'对象没有属性'内容'
我试图在那里抛出一个if语句,但无法让它工作。
如何让我的脚本打印出来?没有结果'如果在该属性中找不到域,则继续浏览其余的IP?
import urllib2
from BeautifulSoup import BeautifulSoup
import StringIO
ipfile = open("test.txt", "r")
for line in ipfile:
line = line.strip()
site = 'http://bgp.he.net/ip/' + line + '#_dns'
#print site
s = StringIO.StringIO(site)
for line2 in s:
req = urllib2.Request(line2)
req.add_header('User-agent', 'Mozilla/5.0 (Windows NT 5.1; rv:23.0) Gecko/20100101 Firefox/23.0')
html = urllib2.urlopen(req)
soup = BeautifulSoup(html.read())
#print soup.prettify()
results = soup.find("div", {"id": "dns"}).a.contents
results = '\n'.join(results)
print results
f = open('out.txt', 'a')
print >>f, results
f.close
答案 0 :(得分:2)
对error handling使用try
/ except
。
try:
soup = BeautifulSoup(html.read())
#print soup.prettify()
results = soup.find("div", {"id": "dns"}).a.contents
results = '\n'.join(results)
print results
f = open('out.txt', 'a')
print >>f, results
f.close
except:
print 'No result'
如果try
块中发生任何错误,则会立即停止,然后转到except
阻止。这将使您的代码继续运行,而不会停止一切。
如果你想真正具体,你可以告诉python只处理特定类型的异常,在这种情况下你可以这样做:
except AttributeError:
代替except:
答案 1 :(得分:1)
你可以使用try / except,除了AttributeError之外(抓住它们都很糟糕,因为你会忽略潜在的错误,如果你全部捕获它们),例如 -
try:
results = soup.find("div", {"id": "dns"}).a.contents
results = '\n'.join(results)
print results
with open('out.txt', 'a') as f:
print >>f, results
except AttributeError:
print '<Message when no <a> tag found inside `div` with `id` dns>'