2017-08-05 1 views
0

Je suis en train de mettre au rebut une liste d'URL avec le même format html. Voici mon scrapperGestion des exceptions Python TypeError: L'objet 'NoneType' n'est pas appelable

import requests, bs4, csv, json 
from pprint import pprint 

with open('playerslist.json') as data_file: 
    data = json.load(data_file) 
    for i in data['player']: 
     name = i['player_name'] 
     url = 'https://www.capfriendly.com/players/'+name 
     r = requests.get(url) 
     soup = bs4.BeautifulSoup(r.text, 'lxml') 
     table = soup.find(id="cont_x") 

     with open(name+".csv", "w", newline='') as team_data: 
      def parse_td(td): 
       filtered_data = [tag.text for tag in td.find_all('span', recursive=False) 
            if 'q' not in tag.attrs['class']] 
       return filtered_data[0] if filtered_data else td.text; 

      for tr in table('tr', class_=['column_head', 'odd', 'even']): 
       row = [parse_td(td) for td in tr('td')] 
       writer = csv.writer(team_data) 
       writer.writerow(row) 

Le problème est que certains de ne plus exister pages (https://www.capfriendly.com/players/'+name) l'URL. Ce qui signifie que lorsque je tente de les gratter, je reçois l'erreur suivante

for tr in table('tr', class_=['column_head', 'odd', 'even']): 
TypeError: 'NoneType' object is not callable 

je pouvais faire en sorte que ma liste d'urls sont tous valides mais j'ai 10000 urls à passer. C'est pourquoi je cherche un moyen de gérer l'exception, de cette façon, si une page n'existe plus, elle est ignorée et l'URL suivante est supprimée.

En outre, s'il existe un moyen plus efficace de stocker les données, veuillez me le faire savoir.

Répondre

1

La gestion des exceptions en python se fait avec try...except statement.

try: 
     for tr in table('tr', class_=['column_head', 'odd', 'even']): 
      row = [parse_td(td) for td in tr('td')] 
      writer = csv.writer(team_data) 
      writer.writerow(row) 
    except TypeError: 
     pass 

Cela ignorera la TypeError exception relevée lorsque table est None, car l'URL n'existe plus. Vous pouvez également vérifier table avant la boucle, mais l'approche try... except est considérée comme plus «pythonique», puisque la gestion des exceptions n'est pas beaucoup plus lente que les contrôles dans la plupart des cas (et pour d'autres raisons subjectives bien sûr).