python - 当我尝试从网站上获取文档时出现问题

时间:2011-08-22 09:54:58

标签: python beautifulsoup

我尝试从此页面下载文档 Securities Class Action Filings

我试图在页面上下载25个文档。 我觉得这很简单,这是我的代码:

from BeautifulSoup import BeautifulSoup
import re
import urllib2
import os

if __name__ == "__main__":
  pre_url = "http://securities.stanford.edu"
  url = "http://securities.stanford.edu/fmi/xsl/SCACPUDB/recordlist.xsl?-db=SCACPUDB&-lay=Search&FIC_DateFiled_Quater=Q1&FIC_DateFiled_Year=2011&-sortfield.1=FIC_DateFiled&-sortfield.2=LitigationName&-sortorder.1=ascend&-max=25&-find" 
  response = urllib2.urlopen(url)
  soup = BeautifulSoup(response.read()).findAll('tr')
  url_list = []
  for s in soup[8:]:
    url_list.append(pre_url + s.a['href'])
  for x in url_list:
    name = x.split("/")[4]  
    context = urllib2.urlopen(x).read()
    soup = BeautifulSoup(context)
    file = open(name + ".txt", "w")
    file.write(soup.prettify())
  print "DONE"

执行脚本后,我成功下载了25个文件。 但后来我发现其中10个充满了垃圾字符! 怎么会? 任何人都可以帮助我吗?

非常感谢,对不起我的英语很差。

更新: 这是脚本不正确下载的页面之一 http://securities.stanford.edu/1046/BWEN00_01/

2 个答案:

答案 0 :(得分:2)

示例页面以UTF-16编码,但没有在标题中正确提供该factoid。

>>> page = urllib2.urlopen( "http://securities.stanford.edu/1046/BWEN00_01" )
>>> page.info().headers
['Date: Mon, 22 Aug 2011 13:13:56 GMT\r\n', 'Server: Apache/1.3.33 (Darwin) mod_jk/1.2.2 DAV/1.0.3\r\n', 'Cache-Control: max-age=60\r\n', 'Expires: Mon, 22 Aug 2011 13:14:56 GMT\r\n', 'Last-Modified: Thu, 21 Jul 2011 22:06:51 GMT\r\n', 'ETag: "18b9a6e-9af6-4e28a2fb"\r\n', 'Accept-Ranges: bytes\r\n', 'Content-Length: 39670\r\n', 'Connection: close\r\n', 'Content-Type: text/html\r\n']

尝试page.decode('utf-16')以正确的Unicode字符而不是字节来查看页面。

答案 1 :(得分:0)

open(name + ".txt", "w")

您的问题可能是您在文本模式下打开文件,但它们是以二进制模式下载的。用

替换上面的表达式
open(name + ".txt", "wb")

看看它是否有所改善。