2014-10-30 2 views
0

У меня возникли проблемы с очисткой определенных полей на веб-страницах. У меня есть код ниже, который хорошо выполняет 1-й два для циклов, но я затрудняюсь с последним циклом цикла.Скребок с BeautifulSoup

from bs4 import BeautifulSoup 
import urllib2 
url="https://www.mturk.com/mturk/findhits?match=false" 
page=urllib2.urlopen(url) 
soup = BeautifulSoup(page.read()) 


requesters=soup.findAll('span',{'class':'requesterIdentity'}) 
for eachrequester in requesters: 
    print "Requester Name: "+eachrequester.string 

rewards=soup.findAll('span',{'class':'reward'}) 
for eachreward in rewards: 
    print "Reward: "+eachreward.string 


hitnames=soup.findAll('a',{'class':'capsulelink'}) #THE ISSUE IS IN THESE 3 LINES 
for eachhitname in hitnames: 
    print "Hit Name: "+eachhitname.string 

в настоящее время код выводит:

Requester Name: Andrew Ryan 
Requester Name: Vishwanath Kumar 
Requester Name: rohzit0d 
Requester Name: Jon Brelig 
Requester Name: Tagasauris 
Requester Name: Tagasauris 
Requester Name: Tagasauris 
Requester Name: CopyText Inc. 
Requester Name: Tagasauris 
Requester Name: Amazon Requester Inc. 
Reward: $0.24 
Reward: $0.03 
Reward: $0.00 
Reward: $0.05 
Reward: $0.04 
Reward: $0.02 
Reward: $0.02 
Reward: $0.01 
Reward: $0.04 
Reward: $0.00 

Traceback (most recent call last): 
    File "C:/Users/admin/Desktop/pythonimageret/hitgwt.py", line 19, in <module> 
    print "Hit Name: "+eachhitname.string 
TypeError: cannot concatenate 'str' and 'NoneType' objects 

Я понимаю, что сценарий не может найти содержимое HTML здесь. HTML выглядит следующим образом:

<a class="capsulelink" href="#" id="capsule6-0"> 
    Indoors or Out? 
    <span class="tags"></span> 
</a> 

Я думаю, это потому, что href="#" id="capsule6-0" в между class="" и >

ответ

0

eachhitname.string является None, потому что атрибут содержит только текст, если нет других тегов в текущем элементе. Каждая из этих ссылок имеет элемент <span class="tags"></span>.

Используйте вместо этого атрибут .text; добавив в str.strip() звонок, чтобы удалить лишние пробелы:

hitnames = soup.findAll('a', {'class':'capsulelink'}) 
for eachhitname in hitnames: 
    print "Hit Name: " + eachhitname.text.strip() 
+0

Спасибо большое, отлично, и я понимаю, почему. (sry, я не могу продвигать, у меня пока нет хорошей репутации) – Rorschach

Смежные вопросы