BeautifulSoup 未找到属性

BeautifulSoup no attribute found

我有一个 IP 地址的文本文件,每个 IP 地址都在自己的行中。下面的脚本将 运行 遍历列表并查询站点以查找与 IP 匹配的域并将它们打印到文件中。如果每个 IP 都有结果,这可以正常工作,但是当站点没有 return 域时,我会收到以下错误,即 BeautifulSoup 无法匹配属性并且脚本失败。

AttributeError: 'NoneType' object has no attribute '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

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:

您可以使用 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>'