web-dev-qa-db-ja.com

Python:urllib.error.HTTPError:HTTPエラー404:見つかりません

SO質問のタイトルのスペルミスを見つけるためのスクリプトを作成しました。約1か月間使用しました。これは、問題なく機能していました。

しかし今、私がそれを実行しようとすると、私はこれを手に入れています。

Traceback (most recent call last):
  File "copyeditor.py", line 32, in <module>
    find_bad_qn(i)
  File "copyeditor.py", line 15, in find_bad_qn
    html = urlopen(url)
  File "/usr/lib/python3.4/urllib/request.py", line 161, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/lib/python3.4/urllib/request.py", line 469, in open
    response = meth(req, response)
  File "/usr/lib/python3.4/urllib/request.py", line 579, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python3.4/urllib/request.py", line 507, in error
    return self._call_chain(*args)
  File "/usr/lib/python3.4/urllib/request.py", line 441, in _call_chain
    result = func(*args)
  File "/usr/lib/python3.4/urllib/request.py", line 587, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 404: Not Found

これは私のコードです

import json
from urllib.request import urlopen
from bs4 import BeautifulSoup
from enchant import DictWithPWL
from enchant.checker import SpellChecker

my_dict = DictWithPWL("en_US", pwl="terms.dict")
chkr = SpellChecker(lang=my_dict)
result = []


def find_bad_qn(a):
    url = "https://stackoverflow.com/questions?page=" + str(a) + "&sort=active"
    html = urlopen(url)
    bsObj = BeautifulSoup(html, "html5lib")
    que = bsObj.find_all("div", class_="question-summary")
    for div in que:
        link = div.a.get('href')
        name = div.a.text
        chkr.set_text(name.lower())
        list1 = []
        for err in chkr:
            list1.append(chkr.Word)
        if (len(list1) > 1):
            str1 = ' '.join(list1)
            result.append({'link': link, 'name': name, 'words': str1})


print("Please Wait.. it will take some time")
for i in range(298314,298346):
    find_bad_qn(i)
for qn in result:
    qn['link'] = "https://stackoverflow.com" + qn['link']
for qn in result:
    print(qn['link'], " Error Words:", qn['words'])
    url = qn['link']

[〜#〜]更新[〜#〜]

これが問題の原因となっているURLです。このURLが存在していても。

https://stackoverflow.com/questions?page=298314&sort=active

範囲をもっと低い値に変えてみました。今は問題なく動作します。

なぜこれが上記のURLで起こったのですか?

2
jophab

したがって、明らかにデフォルトの1ページあたりの質問数は50であるため、ループで定義した範囲は、1ページあたり50の質問がある利用可能なページ数から外れます。範囲は、それぞれ50の質問がある合計ページ数の範囲内になるように調整する必要があります。

このコードは、エラーが発生した理由である404エラーをキャッチし、範囲外になった場合に備えて無視します。

from urllib.request import urlopen

def find_bad_qn(a):
    url = "https://stackoverflow.com/questions?page=" + str(a) + "&sort=active"
    try:
        urlopen(url)
    except:
        pass

print("Please Wait.. it will take some time")
for i in range(298314,298346):
    find_bad_qn(i)
3
Atirag

私はまったく同じ問題を抱えています。 urllibを使用して取得したいURLが存在し、通常のブラウザーを使用してアクセスできますが、urllibは404を教えてくれます。

私にとっての解決策はurllibを使用しないことです:

import requests
requests.get(url)

これは私にとってはうまくいきます。

3
przemaz

Requestをインポートして、URLの最後に_, headers={'User-Agent': 'Mozilla/5.0'}_を追加してみてください。

すなわち:

_from urllib.request import Request, urlopen_

url = "https://stackoverflow.com/questions?page=" + str(a) + "&sort=active"

req = Request(url, headers={'User-Agent': 'Mozilla/5.0'})

html = urlopen(req)

0
Stevo