我有一个IP地址的文本文件,每个地址都在自己的行中。下面的脚本将遍历列表并查询站点以查找与IP匹配的域并将其打印到文件中。如果每个IP都有一个结果,那么这个工作正常,但是当站点不返回域时,我会得到以下错误,即BeautifulSoup与属性不匹配,并且脚本失败。
AttributeError:“NoneType”对象没有“contents”属性
我试着在里面加一个if语句,但没能成功。
如果在该属性中找不到域,如何使脚本打印“no result”并继续通过其余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

最佳答案

使用try/except表示error handling

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:

关于python - BeautifulSoup找不到属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32020773/

10-09 17:10
查看更多