BeautifulSoup找不到任何属性

时间:2015-08-15 01:59:29

标签: python beautifulsoup

我有一个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

2 个答案:

答案 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>'