【问题标题】:I get InvalidURL: URL can't contain control characters when I try to send a request using urllib当我尝试使用 urllib 发送请求时,我得到 InvalidURL: URL can't contain control characters
【发布时间】:2021-02-07 18:30:25
【问题描述】:

我正在尝试从用作 urllib 请求参数的链接中获取 JSON 响应。但它给了我一个错误,它不能包含控制字符。

我该如何解决这个问题?

start_url = "https://devbusiness.un.org/solr-sitesearch-output/10//0/ds_field_last_updated/desc?bundle_fq =procurement_notice&sm_vid_Institutions_fq=&sm_vid_Procurement_Type_fq=&sm_vid_Countries_fq=&sm_vid_Sectors_fq= &sm_vid_Languages_fq=English&sm_vid_Notice_Type_fq=&deadline_multifield_fq=&ts_field_project_name_fq=&label_fq=&sm_field_db_ref_no__fq=&sm_field_loan_no__fq=&dm_field_deadlineFrom_fq=&dm_field_deadlineTo_fq =&ds_field_future_posting_dateFrom_fq=&ds_field_future_posting_dateTo_fq=&bm_field_individual_consulting_fq="
    
source = urllib.request.urlopen(start_url).read()

我得到的错误是:

URL can't contain control characters. '/solr-sitesearch-output/10//0/ds_field_last_updated/desc?bundle_fq =procurement_notice&sm_vid_Institutions_fq=&sm_vid_Procurement_Type_fq=&sm_vid_Countries_fq=&sm_vid_Sectors_fq= &sm_vid_Languages_fq=English&sm_vid_Notice_Type_fq=&deadline_multifield_fq=&ts_field_project_name_fq=&label_fq=&sm_field_db_ref_no__fq=&sm_field_loan_no__fq=&dm_field_deadlineFrom_fq=&dm_field_deadlineTo_fq =&ds_field_future_posting_dateFrom_fq=&ds_field_future_posting_dateTo_fq=&bm_field_individual_consulting_fq=' (found at least ' ')

【问题讨论】:

  • 它是一个有效的 URL 吗?它不适用于浏览器,并且有一个奇怪的部分/10//0/ 。正常情况下,双斜杠//可以换成单斜杠,那么URL就会给出page not found。
  • 你是对的,我提供了错误的 URL,我已修复它。谢谢。小错误总是让人头疼。
  • 请确保您对网址进行编码:urlencoder.io/python 实际上在网址中,“”应该是“%20”或“+”
  • 看起来像一个不可打印的字符不知何故溜进了 URL。

标签: python web-scraping beautifulsoup urllib


【解决方案1】:

将空格替换为:

url = url.replace(" ", "%20")

如果问题出在空白处,将解决它

【讨论】:

    【解决方案2】:

    Solr 搜索字符串会变得很奇怪。在发出请求之前,最好使用 'quote' 方法对字符进行编码。请参见下面的示例:

    from urllib.parse import quote
    
    start_url = "https://devbusiness.un.org/solr-sitesearch-output/10//0/ds_field_last_updated/desc?bundle_fq =procurement_notice&sm_vid_Institutions_fq=&sm_vid_Procurement_Type_fq=&sm_vid_Countries_fq=&sm_vid_Sectors_fq= &sm_vid_Languages_fq=English&sm_vid_Notice_Type_fq=&deadline_multifield_fq=&ts_field_project_name_fq=&label_fq=&sm_field_db_ref_no__fq=&sm_field_loan_no__fq=&dm_field_deadlineFrom_fq=&dm_field_deadlineTo_fq =&ds_field_future_posting_dateFrom_fq=&ds_field_future_posting_dateTo_fq=&bm_field_individual_consulting_fq="
        
    source = urllib.request.urlopen(quote(start_url)).read()
    
    

    迟到总比没有好...

    【讨论】:

      【解决方案3】:

      你现在可能已经发现了,但让我们把它写在这里。

      URL中不能有任何空格字符,并且有2个,在bundle_fq e dm_field_deadlineTo_fq

      之后

      删除这些,你就可以开始了

      【讨论】:

        【解决方案4】:

        URL 中不允许有空格,我删除了它们,现在它似乎可以工作了:

        import urllib.request
        start_url = "https://devbusiness.un.org/solr-sitesearch-output/10//0/ds_field_last_updated/desc?bundle_fq =procurement_notice&sm_vid_Institutions_fq=&sm_vid_Procurement_Type_fq=&sm_vid_Countries_fq=&sm_vid_Sectors_fq= &sm_vid_Languages_fq=English&sm_vid_Notice_Type_fq=&deadline_multifield_fq=&ts_field_project_name_fq=&label_fq=&sm_field_db_ref_no__fq=&sm_field_loan_no__fq=&dm_field_deadlineFrom_fq=&dm_field_deadlineTo_fq =&ds_field_future_posting_dateFrom_fq=&ds_field_future_posting_dateTo_fq=&bm_field_individual_consulting_fq="
        url = start_url.replace(" ","")
        source = urllib.request.urlopen(url).read()
        

        【讨论】:

          【解决方案5】:

          您需要在 URL 内输入encode the control characters。特别是空格需要编码为%20。

          【讨论】:

            【解决方案6】:

            正如错误消息所说,您的网址中有一些control characters,顺便说一句,这似乎不是一个有效的。

            【讨论】:

              猜你喜欢
              • 2015-09-23
              • 2013-01-05
              • 2021-11-15
              • 2015-03-02
              • 1970-01-01
              • 2016-09-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多