Ошибка ArticleException при очистке веб-статей от python - PullRequest
1 голос
/ 01 мая 2020

Я пытаюсь отсканировать новостные статьи по определенным ключевым словам. Я использую Python 3. Однако я не могу получить все статьи из газеты. После очистки некоторых статей в виде файла csv я получаю ошибку ArticleException. Может ли кто-нибудь помочь мне с этим? В идеале я хотел бы решить проблему и загрузить все соответствующие статьи с сайта газеты. В противном случае было бы также полезно пропустить URL-адрес, отображающий ошибку, и продолжить со следующего. Заранее спасибо за помощь.

Это код, который я использую:

import urllib.request
import newspaper
from newspaper import Article
import csv, os
from bs4 import BeautifulSoup
import urllib

req_keywords = ['coronavirus', 'covid-19']

newspaper_base_url = 'http://www.thedailystar.net'
category = 'country'

def checkif_kw_exist(list_one, list_two):
    common_kw = set(list_one) & set(list_two)
    if len(common_kw) == 0: return False, common_kw
    else: return True, common_kw

def get_article_info(url):
    a = Article(url)
    a.download()
    a.parse()
    a.nlp()
    success, checked_kws = checkif_kw_exist(req_keywords, a.text.split())
    if success:
        return [url, a.publish_date, a.title, a.text]
    else: return False


output_file = "J:/B/output.csv"
if not os.path.exists(output_file):
    open(output_file, 'w').close() 


for index in range(1,50000,1):

    page_soup = BeautifulSoup( urllib.request.urlopen(page_url).read())

    primary_tag = page_soup.find_all("h4", attrs={"class": "pad-bottom-small"})

    for tag in primary_tag:

        url = tag.find("a")
        #print (url)
        url = newspaper_base_url + url.get('href')
        result = get_article_info(url)
        if result is not False:
            with open(output_file, 'a', encoding='utf-8') as f:
                writeFile = csv.writer(f)
                writeFile.writerow(result)
                f.close
        else: 
            pass

Это ошибка, которую я получаю:

---------------------------------------------------------------------------
ArticleException                          Traceback (most recent call last)
<ipython-input-1-991b432d3bd0> in <module>
     65         #print (url)
     66         url = newspaper_base_url + url.get('href')
---> 67         result = get_article_info(url)
     68         if result is not False:
     69             with open(output_file, 'a', encoding='utf-8') as f:

<ipython-input-1-991b432d3bd0> in get_article_info(url)
     28     a = Article(url)
     29     a.download()
---> 30     a.parse()
     31     a.nlp()
     32     success, checked_kws = checkif_kw_exist(req_keywords, a.text.split())

~\Anaconda3\lib\site-packages\newspaper\article.py in parse(self)
    189 
    190     def parse(self):
--> 191         self.throw_if_not_downloaded_verbose()
    192 
    193         self.doc = self.config.get_parser().fromstring(self.html)

~\Anaconda3\lib\site-packages\newspaper\article.py in throw_if_not_downloaded_verbose(self)
    530         elif self.download_state == ArticleDownloadState.FAILED_RESPONSE:
    531             raise ArticleException('Article `download()` failed with %s on URL %s' %
--> 532                   (self.download_exception_msg, self.url))
    533 
    534     def throw_if_not_parsed_verbose(self):

ArticleException: Article `download()` failed with HTTPSConnectionPool(host='www.thedailystar.net', port=443): Read timed out. (read timeout=7) on URL http://www.thedailystar.net/ugc-asks-private-universities-stop-admissions-grades-without-test-for-coronavirus-pandemic-1890151

1 Ответ

1 голос
/ 01 мая 2020

Самый быстрый способ пропустить сбои, связанные с загруженным контентом, заключается в использовании try/except следующим образом:

def get_article_info(url):
  a = Article(url)
  try:
    a.download()
    a.parse()
    a.nlp()
    success, checked_kws = checkif_kw_exist(req_keywords, a.text.split())
    if success:
      return [url, a.publish_date, a.title, a.text]
    else: return False
  except:
    return False

Использование except для отлова всех возможных Исключение, и игнорировать его, не рекомендуется, и этот ответ был бы отвергнут, если бы я не предложил вам немного лучше разобраться с исключениями. Вы также спросили о решении проблемы. Не читая документацию по библиотекам, которые вы импортируете, вы не будете знать, какие исключения могут возникнуть, поэтому распечатка деталей исключений во время их пропуска даст вам детали, такие как ArticleException, который вы получаете сейчас. И вы можете начать добавлять отдельные except разделы, чтобы иметь дело с ними для тех, с которыми вы уже сталкивались:

def get_article_info(url):
  a = Article(url)
  try:
    a.download()
    a.parse()
    a.nlp()
    success, checked_kws = checkif_kw_exist(req_keywords, a.text.split())
    if success:
      return [url, a.publish_date, a.title, a.text]
    else: 
      return False
   except ArticleException as ae:
     print (ae)
     return False
   except Exception as e:
     print(e)
     return False

ArticleException, который вы получаете, говорит вам, что вы получаете ошибку timeout Это означает, что ответ от Daily Star не завершен в течение определенного времени. Может быть, он очень занят :) Вы можете попробовать скачать несколько раз, прежде чем сдаться.

...