Python 3 urllib HTTP错误412:前提条件失败

时间:2017-07-23 14:29:44

标签: html python-3.x parsing request urllib

我正在尝试解析网站的HTML数据。我写了这段代码:

import urllib.request

def parse(url):
    response = urllib.request.urlopen(url)
    html = response.read()
    strHTML = html.decode()
    return strHTML

website = "http://www.manarat.ac.bd/"
string = parse(website)

但它显示此错误:

  

追踪(最近一次通话):   文件“C:\ Users \ pupewekate \ Videos \ RAW \ 2.py”,第11行,中     string = parse(网站)    文件“C:\ Users \ pupewekate \ Videos \ RAW \ 2.py”,第5行,在解析中     response = urllib.request.urlopen(url)   文件     “C:\用户\ pupewekate \应用程序数据\本地\程序\ Python的\ Python36-32 \ LIB \的urllib \ request.py”     第223行,在urlopen中返回opener.open(url,data,timeout)   文件     “C:\用户\ pupewekate \应用程序数据\本地\程序\ Python的\ Python36-32 \ LIB \的urllib \ request.py”     第532行,开放式响应= meth(req,response)   文件     “C:\用户\ pupewekate \应用程序数据\本地\程序\ Python的\ Python36-32 \ LIB \的urllib \ request.py”     第642行,在http_response'htt'中,请求,响应,代码,消息,     HDRS)   文件     “C:\用户\ pupewekate \应用程序数据\本地\程序\ Python的\ Python36-32 \ LIB \的urllib \ request.py”     第570行,错误返回> self._call_chain(*参数)   文件     “C:\用户\ pupewekate \应用程序数据\本地\程序\ Python的\ Python36-32 \ LIB \的urllib \ request.py”     第504行,在_call_chain中结果= func(* args)   文件     “C:\用户\ pupewekate \应用程序数据\本地\程序\ Python的\ Python36-32 \ LIB \的urllib \ request.py”     第650行,http_error_default引发HTTPError(req.full_url,代码,     msg,hdrs,fp)urllib.error.HTTPError:HTTP错误412:前提条件     失败

任何解决方案?

2 个答案:

答案 0 :(得分:0)

此网站检查用户代理标头。如果它没有识别其值,则返回状态码412:

import requests

print(requests.get('http://www.manarat.ac.bd/'))
# <Response [412]>

print(requests.get('http://www.manarat.ac.bd/', headers={'User-Agent': 'Chrome'}))
# <Response [200]>

有关如何在urlib中设置用户代理的信息,请参阅this answer

答案 1 :(得分:0)

您可以使用请求模块,因为它更容易实现,否则如果您决定使用urllib,则可以使用:

import urllib

def parse(url):
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3;Win64;x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'}
    response = urllib.request.urlopen(url,headers=headers)
    print response

website = "http://www.manarat.ac.bd/"
string = parse(website)