【问题标题】:Python 3 urllib HTTP Error 412: Precondition FailedPython 3 urllib HTTP 错误 412:前提条件失败
【发布时间】:2017-12-29 04:33:43
【问题描述】:

我正在尝试解析网站的 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)

但它显示此错误:

Traceback(最近一次调用最后一次): 文件“C:\Users\pupewekate\Videos\RAW\2.py”,第 11 行,在
字符串 = 解析(网站) 解析中的文件“C:\Users\pupewekate\Videos\RAW\2.py”,第 5 行
响应 = urllib.request.urlopen(url) 文件 "C:\Users\pupewekate\AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", 第 223 行,在 urlopen 返回 opener.open(url, data, timeout) 文件 "C:\Users\pupewekate\AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", 第 532 行,公开响应 = meth(req, response) 文件 "C:\Users\pupewekate\AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", 第 642 行,在 http_response 'http' 中,请求、响应、代码、味精、 人类发展报告) 文件 "C:\Users\pupewekate\AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", 第 570 行,错误返回 > self._call_chain(*args) 文件 "C:\Users\pupewekate\AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", 第 504 行,在 _call_chain 结果 = func(*args) 文件 "C:\Users\pupewekate\AppData\Local\Programs\Python\Python36-32\lib\urllib\request.py", 第 650 行,在 http_error_default 中引发 HTTPError(req.full_url, code, msg, hdrs, fp) urllib.error.HTTPError: HTTP 错误 412: 前提 失败

有什么办法吗?

【问题讨论】:

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


    【解决方案1】:

    该网站检查用户代理标头。如果它不能识别它的值,它会返回状态码 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]>
    

    请参阅this answer 了解如何在 urllib 中设置用户代理。

    【讨论】:

      【解决方案2】:

      你可以使用 requests 模块,因为它更容易实现,否则如果你确定使用 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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-17
        • 1970-01-01
        相关资源
        最近更新 更多