2011-12-20 3 views
0

Я использую красивый модуль супа, чтобы очистить название списка веб-страниц, сохраненных в csv. Сценарий, кажется, работает нормально, но как только он достигнет домена 82nd он выдает следующее сообщение об ошибке:Beautiful Soup error

Traceback (most recent call last): 
    File "soup.py", line 31, in <module> 
    print soup.title.renderContents() # 'Google' 
AttributeError: 'NoneType' object has no attribute 'renderContents' 

Я довольно новыми для Python, так что я не уверен, что понял ошибку, будет ли кто-нибудь в состоянии уточнить, что происходит не так?

мой код:

import csv 
import socket 
from urllib2 import Request, urlopen, URLError, HTTPError 
from BeautifulSoup import BeautifulSoup 

debuglevel = 0 

timeout = 5 

socket.setdefaulttimeout(timeout) 
domains = csv.reader(open('domainlist.csv')) 
f = open ('souput.txt', 'w') 
for row in domains: 
domain = row[0] 
req = Request(domain) 
try: 
    html = urlopen(req).read() 
    print domain 
except HTTPError, e: 
    print 'The server couldn\'t fulfill the request.' 
    print 'Error code: ', e.code 
except URLError, e: 
    print 'We failed to reach a server.' 
    print 'Reason: ', e.reason 
else: 
    # everything is fine 
    soup = BeautifulSoup(html) 

    print soup.title # '<title>Google</title>' 
    print soup.title.renderContents() # 'Google' 
    f.writelines(domain) 
    f.writelines(" ") 
    f.writelines(soup.title.renderContents()) 
    f.writelines("\n") 

ответ

1

Как maozet сказал, ваша проблема в том, что название Нет, вы не можете проверить это значение, чтобы избежать проблемы, как это:

soup = BeautifulSoup(html) 

if soup.title != None: 
    print soup.title # '<title>Google</title>' 
    print soup.title.renderContents() # 'Google' 
    f.writelines(domain) 
    f.writelines(" ") 
    f.writelines(soup.title.renderContents()) 
    f.writelines("\n") 
+0

Спасибо! который, похоже, выполняет эту работу. –

1

Что делать, если страница не имеет заголовка ???
У меня была эта проблема один раз .... просто поставьте код в попытке, кроме или проверьте заголовок.

+0

Это ... имеет большой смысл! Я попытаюсь выяснить, как это сделать сейчас :) –

+1

Я думаю, что лучше было бы проверить None, например 'if soup.title! = None:', а затем сделать свою вещь –

+0

Я пробовал добавить исключения none, но не работаю, боюсь, я не очень разбираюсь в обработке ошибок. –

0

Я сталкивается с той же проблемой, но читает несколько взаимосвязанных вопросов и googling помог мне. Вот что я хотел бы предложить для обработки конкретных ошибок, таких как NoneType:

soup = BeautifulSoup(urllib2.urlopen('http://webpage.com').read()) 
scrapped = soup.find(id='whatweseekfor') 

if scrapped == None: 
    # command when encountering an error eg: print none 

elif scrapped != None: 
    # command when there is no None type error eg: print scrapped.get_text() 

Удачи!