从HTML头部抓取值并保存为CSV文件的Python方法
大家好,
我刚开始使用Python(版本2.7.1),我的第一个程序是想从一个包含电站数据的网站上抓取信息。我打算用标准库和BeautifulSoup来处理HTML元素。
我想获取的数据可以在HTML的“头部”部分找到,或者在主内容中的表格里。如果点击CSV链接,网站会生成一个CSV文件。
我参考了这个网站上的几个资料,拼凑出了下面的代码,可以提取数据并保存到文件里,但文件里有\n这样的标记。无论我怎么尝试,都无法保存出正确的CSV文件。
我相信这一定是个简单的问题,但如果可以的话,我需要一些帮助!
from BeautifulSoup import BeautifulSoup
import urllib2,string,csv,sys,os
from string import replace
bm_url = 'http://www.bmreports.com/servlet/com.logica.neta.bwp_PanBMDataServlet?param1=T_COTPS-4¶m2=¶m3=¶m4=¶m5=2011-02-05¶m6=*'
data = urllib2.urlopen(bm_url).read()
soup = BeautifulSoup(data)
data = str(soup.findAll('head',limit=1))
data = replace(data,'[<head>','')
data = replace(data,'<script language="JavaScript" src="/bwx_generic.js"></script>','')
data = replace(data,'<link rel="stylesheet" type="text/css" href="/bwx_style.css" />','')
data = replace(data,'<title>Historic Physical Balancing Mechanism Data</title>','')
data = replace(data,'<script language="JavaScript">','')
data = replace(data,' </script>','')
data = replace(data,'</head>]','')
data = replace(data,'var gs_csv=','')
data = replace(data,'"','')
data = replace(data,"'",'')
data = data.strip()
file_location = 'c:/temp/'
file_name = file_location + 'DataExtract.txt'
file = open(file_name,"wb")
file.write(data)
file.close()
2 个回答
1
解决方案
from BeautifulSoup import BeautifulSoup
import urllib2,string,csv,sys,os,time
bm_url_stem = "http://www.bmreports.com/servlet/com.logica.neta.bwp_PanBMDataServlet?param1="
bm_station = "T_COTPS-3"
bm_param = "¶m2=¶m3=¶m4=¶m5="
bm_date = "2011-02-04"
bm_param6 = "¶m6=*"
bm_full_url = bm_url_stem + bm_station + bm_param + bm_date + bm_param6
data = urllib2.urlopen(bm_full_url).read()
soup = BeautifulSoup(data)
scripttag = soup.head.findAll("script")[1]
javascriptdata = scripttag.contents[0]
javascriptdata = javascriptdata.partition('=')[2]
javascriptdata = javascriptdata.strip(' \n"')
javascriptdata = javascriptdata.replace("\\n","\n")
javascriptdata = javascriptdata.strip()
csvwriter = csv.writer(file("c:/temp/" + bm_station + "_" + bm_date + ".csv", "wb"))
for line in javascriptdata.splitlines():
row = line.split(",")
csvwriter.writerow(row)
del csvwriter
4
不要把它再转回字符串后再用替换,这样就完全失去了使用BeautifulSoup的意义!
可以这样开始:
scripttag = soup.head.findAll("script")[1]
javascriptdata = scripttag.contents[0]
然后你可以使用:
partition('=')[2]
来切掉 "var gs_csv" 这一部分。strip(' \n"')
来去掉两端不需要的字符(比如空格、换行符和"
)。replace("\\n","\n")
来处理换行符。
顺便说一下,替换是字符串的方法,所以你不需要单独导入它,你可以直接用 data.replace(...
。
最后,你需要把它分开成csv格式。你可以先保存再重新打开,然后用csv.reader来加载。你也可以使用StringIO
模块,把它变成可以直接喂给csv.reader的东西(也就是说,不用先保存成文件)。不过我觉得这个数据简单到你可以直接这样做:
for line in data.splitlines():
row = line.split(",")