0

全部,

我刚开始使用 Python (v 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()
4

2 回答 2

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")整理新行。

顺便说一句,replace 是一个字符串方法,所以不用单独导入,只需data.replace(....

最后,您需要将其分隔为 csv。您可以保存并重新打开它,然后将其加载到 csv.reader 中。您可以使用该StringIO模块将其转换为可以直接提供给 csv.reader 的内容(即无需先保存文件)。但我认为这些数据很简单,你可以做以下事情:

for line in data.splitlines():
    row = line.split(",")
于 2011-02-06T17:32:01.777 回答
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
于 2011-02-06T21:34:29.883 回答