2017-07-19 5 views
0

Ich habe ein wenig Code, der Zeitung verwendet, um sich verschiedene Medien anzuschauen und Artikel von ihnen herunterzuladen. Das hat lange gut funktioniert, hat aber kürzlich begonnen, sich zu benehmen. Ich kann sehen, was das Problem ist, aber da ich Python neu bin, bin ich mir nicht sicher, wie ich es am besten angehen könnte. Grundsätzlich (glaube ich) muss ich eine Änderung vornehmen, um zu verhindern, dass die gelegentliche fehlerhafte Webadresse das Skript vollständig abstürzt und stattdessen auf diese Webadresse verzichtet und zu den anderen weitergeht.Umgang mit Artikel-Ausnahmen in der Zeitung

Die Ursprünge des Fehlers ist, wenn ich versuche, einen Artikel zum Download mit:

article.download() 

Einige Artikel (sie jeden Tag offensichtlich ändern) den folgenden Fehler werfen, aber das Skript läuft weiter:

Traceback (most recent call last): 
     File "C:\Anaconda3\lib\encodings\idna.py", line 167, in encode 
     raise UnicodeError("label too long") 
    UnicodeError: label too long 

    The above exception was the direct cause of the following exception: 

    Traceback (most recent call last): 
    File "C:\Anaconda3\lib\site-packages\newspaper\mthreading.py", line 38, in run 
     func(*args, **kargs) 
    File "C:\Anaconda3\lib\site-packages\newspaper\source.py", line 350, in download_articles 
     html = network.get_html(url, config=self.config) 
    File "C:\Anaconda3\lib\site-packages\newspaper\network.py", line 39, in get_html return get_html_2XX_only(url, config, response) 
    File "C:\Anaconda3\lib\site-packages\newspaper\network.py", line 60, in get_html_2XX_only url=url, **get_request_kwargs(timeout, useragent)) 
    File "C:\Anaconda3\lib\site-packages\requests\api.py", line 72, in get return request('get', url, params=params, **kwargs) 
    File "C:\Anaconda3\lib\site-packages\requests\api.py", line 58, in request return session.request(method=method, url=url, **kwargs) 
    File "C:\Anaconda3\lib\site-packages\requests\sessions.py", line 502, in request resp = self.send(prep, **send_kwargs) 
    File "C:\Anaconda3\lib\site-packages\requests\sessions.py", line 612, in send r = adapter.send(request, **kwargs) 
    File "C:\Anaconda3\lib\site-packages\requests\adapters.py", line 440, in send timeout=timeout 
    File "C:\Anaconda3\lib\site-packages\urllib3\connectionpool.py", line 600, in urlopen chunked=chunked) 
    File "C:\Anaconda3\lib\site-packages\urllib3\connectionpool.py", line 356, in _make_request conn.request(method, url, **httplib_request_kw) 
    File "C:\Anaconda3\lib\http\client.py", line 1107, in request self._send_request(method, url, body, headers) 
    File "C:\Anaconda3\lib\http\client.py", line 1152, in _send_request self.endheaders(body) 
    File "C:\Anaconda3\lib\http\client.py", line 1103, in endheaders  self._send_output(message_body) 
    File "C:\Anaconda3\lib\http\client.py", line 934, in _send_output self.send(msg) 
    File "C:\Anaconda3\lib\http\client.py", line 877, in send  self.connect() 
    File "C:\Anaconda3\lib\site-packages\urllib3\connection.py", line 166, in connect conn = self._new_conn() 
    File "C:\Anaconda3\lib\site-packages\urllib3\connection.py", line 141, in _new_conn (self.host, self.port), self.timeout, **extra_kw) 
    File "C:\Anaconda3\lib\site-packages\urllib3\util\connection.py", line 60, in create_connection for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM): 
    File "C:\Anaconda3\lib\socket.py", line 733, in getaddrinfo for res in _socket.getaddrinfo(host, port, family, type, proto, flags): 
UnicodeError: encoding with 'idna' codec failed (UnicodeError: label too long) 

Das nächste Bit dann analysieren und die Verarbeitung natürlicher Sprache auf jedem Artikel laufen und schreiben bestimmte Elemente zu einem Datenrahmen soll, so habe ich dann:

for paper in papers:  
for article in paper.articles: 
    article.parse() 
    print(article.title) 
    article.nlp() 
    if article.publish_date is None: 
     d = datetime.now().date() 
    else: 
     d = article.publish_date.date() 
    stories.loc[i] = [paper.brand, d, datetime.now().date(), article.title, article.summary, article.keywords, article.url] 
    i += 1 

(Dies könnte ein wenig schlampig sein, aber das ist ein Problem für einen anderen Tag)

Dies läuft gut, bis es zu einer dieser URLs mit dem Fehler wird und dann wirft einen Artikel Ausnahme und das Skript abstürzt:

C:\Anaconda3\lib\site-packages\PIL\TiffImagePlugin.py:709: UserWarning: Corrupt EXIF data. Expecting to read 2 bytes but only got 0. 
    warnings.warn(str(msg)) 

    ArticleException       Traceback (most recent call last) <ipython-input-17-2106485c4bbb> in <module>() 
      4 for paper in papers: 
      5  for article in paper.articles: 
    ----> 6   article.parse() 
      7   print(article.title) 
      8   article.nlp() 

    C:\Anaconda3\lib\site-packages\newspaper\article.py in parse(self) 
     183 
     184  def parse(self): 
    --> 185   self.throw_if_not_downloaded_verbose() 
     186 
     187   self.doc = self.config.get_parser().fromstring(self.html) 

    C:\Anaconda3\lib\site-packages\newspaper\article.py in throw_if_not_downloaded_verbose(self) 
     519   if self.download_state == ArticleDownloadState.NOT_STARTED: 
     520    print('You must `download()` an article first!') 
    --> 521    raise ArticleException() 
     522   elif self.download_state == ArticleDownloadState.FAILED_RESPONSE: 
     523    print('Article `download()` failed with %s on URL %s' % 

    ArticleException: 

Also, was ist der beste Weg, um dies vor dem Beenden meines Skripts zu halten? Sollte ich es in der Download-Phase, in der ich den Unicode-Fehler erhalte, oder im Parsing-Stadium ansprechen, indem ich ihm sage, diese schlechten Adressen zu übersehen? Und wie würde ich diese Korrektur umsetzen?

Wirklich schätze jeden Rat.

Antwort

0

hatte ich das gleiche Problem, und obwohl im Allgemeinen mit Ausnahme: pass wird nicht empfohlen, die folgenden für mich gearbeitet:

try: 
     a.parse() 
     file.write(a.title+'\n') 
    except : 
     pass