2016-06-30 58 views
0

我试图下载使用urllib.request.urlopen从页面的PDF文件,但它会返回错误:“名单”对象有没有属性“超时”名单'对象有没有属性“超时”

def get_hansard_data(page_url): 
    #Read base_url into Beautiful soup Object 
    html = urllib.request.urlopen(page_url).read() 
    soup = BeautifulSoup(html, "html.parser") 
    #grab <div class="itemContainer"> that hold links and dates to all hansard pdfs 
    hansard_menu = soup.find_all("div","itemContainer") 

    #Get all hansards 
    #write to a tsv file 
    with open("hansards.tsv","a") as f: 
     fieldnames = ("date","hansard_url") 
     output = csv.writer(f, delimiter="\t") 

     for div in hansard_menu: 
      hansard_link = [HANSARD_URL + div.a["href"]] 
      hansard_date = div.find("h3", "catItemTitle").string 

      #download 

      with urllib.request.urlopen(hansard_link) as response: 
       data = response.read() 
       r = open("/Users/Parliament Hansards/"+hansard_date +".txt","wb") 
       r.write(data) 
       r.close() 

      print(hansard_date) 
      print(hansard_link) 
      output.writerow([hansard_date,hansard_link]) 
     print ("Done Writing File") 

请帮忙。

+0

错误发生在哪条线上?你使用的是什么版本的Python? –

+0

你可以给我们堆栈跟踪。您发布的代码不包含超时呼叫,因此很难找到 – jpopesculian

+0

版本:Python 3.4。此行发生错误:使用urllib.request.urlopen(hansard_link)作为响应: –

回答

0

有点晚了,但可能对其他人有帮助(如果不是主题启动者)。我通过解决同样的问题找到了解决方案。

问题是,page_url(你的情况)是一个列表,而不是一个字符串。原因很可能是page_url来自argparse.parse_args()(至少在我的情况是如此)。 做page_url[0]应该可以工作,但在def get_hansard_data(page_url)函数中这样做不好。如果类型不匹配,最好检查参数的类型并向函数调用者返回适当的错误。

参数的类型可以通过调用type(page_url)并比较结果来进行检查,例如:typen("") == type(page_url)。我相信可能有更优雅的方式来做到这一点,但它不在这个特定问题的范围内。

相关问题