从HTML头部抓取值并保存为CSV文件的Python方法

0 投票
2 回答
1801 浏览
提问于 2025-04-16 11:20

大家好,

我刚开始使用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&param2=&param3=&param4=&param5=2011-02-05&param6=*'

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 = "&param2=&param3=&param4=&param5="
bm_date = "2011-02-04"
bm_param6 = "&param6=*"

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]

然后你可以使用:

  1. partition('=')[2] 来切掉 "var gs_csv" 这一部分。
  2. strip(' \n"') 来去掉两端不需要的字符(比如空格、换行符和")。
  3. replace("\\n","\n") 来处理换行符。

顺便说一下,替换是字符串的方法,所以你不需要单独导入它,你可以直接用 data.replace(...

最后,你需要把它分开成csv格式。你可以先保存再重新打开,然后用csv.reader来加载。你也可以使用StringIO模块,把它变成可以直接喂给csv.reader的东西(也就是说,不用先保存成文件)。不过我觉得这个数据简单到你可以直接这样做:

for line in data.splitlines():
    row = line.split(",")

撰写回答