我尝试从此页面下载文档
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/
答案 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")
看看它是否有所改善。