2017-12-21 30 views
0

Webサイトから一部のデータをスクラップするためのスクリプトを作成しましたが、数ページでしか実行されず、"NoneType 'オブジェクトに属性がありません"というエラーが表示される

File "scrappy3.py", line 31, in <module> 
f.writerow(doc_details) 
File "C:\python\lib\encodings\cp1252.py", line 19, in encode 
return codecs.charmap_encode(input,self.errors,encoding_table)[0] 
UnicodeEncodeError: 'charmap' codec can't encode character '\u015f' in 
position 251: character maps to <undefined> 

あなたが私にそれらのerrors.Thisを解決するためにどのようなアドバイスをお願いすることはできますが、私のスクリプトです:

import requests 
import csv 
from bs4 import BeautifulSoup 
import re 
import time 

start_time = time.time() 
page = 1 
f = csv.writer(open("./doctors.csv", "w", newline='')) 
while page <= 5153: 
    url = "http://www.sfatulmedicului.ro/medici/n_s0_c0_h_s0_e0_h0_pagina" + str(page) 
    data = requests.get(url) 
    print ('scraping page ' + str(page)) 
    soup = BeautifulSoup(data.text,"html.parser") 
    for liste in soup.find_all('li',{'class':'clearfix'}): 
     doc_details = [] 
     url_doc = liste.find('a').get('href') 
     for a in liste.find_all('a'): 
      if a.has_attr('name'): 
       doc_details.append(a['name']) 
     data2 = requests.get(url_doc)  
     soup = BeautifulSoup(data2.text,"html.parser") 
     a_tel = soup.find('div',{'class':'contact_doc add_comment'}).a    
     tel_tag=a_tel['onclick'] 
     tel = tel_tag[tel_tag.find("$(this).html("):tel_tag.find(");")].lstrip("$(this).html(") 
     doc_details.append(tel)   
    f.writerow(doc_details) 

    page += 1 
print("--- %s seconds ---" % (time.time() - start_time)) 
+0

どのラインがこれを取得していますか?たぶんスタックトレースでエラーメッセージ全体を投稿することができます。 – RedX

+0

'soup.find( 'div'、{'class': 'contact_doc add_comment'})'は何も見つからず、 'None'を返すので、' .a'は失敗します。 – deceze

+0

@deceze好奇心が強いのは、プログラムがランダムなページで停止し、そのdivがそこにあり、そのページにチェックが入っていたということです。そのURLを取得してもう一度解析する機能を実装する必要があると思いますそれがdivを見つけるまであなたは私の2番目のエラーで私を助けることができますか? – florin

答えて

2
。NoneType時々現れる別のエラーがこれです 『」」オブジェクトには属性がありません』

ここにあなたのエラーはあります

a_tel = soup.find('div',{'class':'contact_doc add_comment'}).a 

soup.findは、明らかに、求められているクラスのdivが見つかりません。戻り値はNoneであり、定義上は属性がありません。

continueにループ内のクエリを追加するかどうかを確認して決定してください。たとえば:

div_contact = soup.find('div',{'class':'contact_doc add_comment'}) 
    if div_contact is None: 
     continue 

    a_tel = div_contact.a 

また、(divが実際に何を期待持っていないように)、理論よりPython的である

div_contact = soup.find('div',{'class':'contact_doc add_comment'}) 
    try: 
     a_tel = div_contact.a 
    except AttributeError: 
     continue 

をより多くのケースをカバーするためにtry .. exceptブロックを試みることができます。いずれにせよあなたの選択。

連続エラーチェックと継続エラーチェックは、プログラムの一部です。

+0

何が好奇妙なのは、プログラムがランダムなページで停止し、そのdivがそこにあり、それがis.Soだと私はそのURLを取得し、それを再度解析する関数を実装する必要があると思いますdiv。あなたも私の2番目のエラーで私を助けることができますか? – florin

+0

おそらく同じエラーが発生します。視覚的に同じクラスの*同じ* divであるように見えても...明らかにそうではありません。つまり、余分なケースを考慮する必要があります。 – mementum

+0

エンコーディングに関して...あなたはエラーをどうするかを決める必要がありますが、 'write'を使うときにUnicodeエンコーディングをカバーする' write'のこの他の答えを見ることができます:https://stackoverflow.com/question/22392377 /エラー書き込み-file-with-file-write-in-python-unicodeencodeerror – mementum

0
resp_find = soup.find('div',{'class':'contact_doc add_comment'}) 
if resp_find is not None: 
    a_tel = resp_find.a 

soup.findの応答は()NoneTypeオブジェクトでない場合は、あなたが

を.Aを適用することができた場合は、クエリを実行することもできますし、soup.find()メソッドはお返ししないことを保証しますNoneTypeオブジェクトなので、このメソッドがNoneTypeオブジェクトを与える理由を調べる必要があります

+0

好奇心は何ですかプログラムがランダムなページで停止し、そのdivがそこにあり、それがis.Soの場合、そのURLを取得してdivを見つけるまで再試行する関数を実装する必要があると思います。私の2番目のエラーで私を助けることができますか? – florin

関連する問題