【问题标题】:Scraping values from HTML header and saving as a CSV file in Python从 HTML 标头中抓取值并在 Python 中保存为 CSV 文件
【发布时间】:2011-02-06 17:23:39
【问题描述】:

全部,

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

【问题讨论】:

  • HTML 文件的副本或网站链接会有所帮助。否则它在黑暗中猜测:(

标签: python html web csv scrape


【解决方案1】:

不要将其转回字符串然后使用替换。这完全违背了使用 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(",")

【讨论】:

  • @Thomas - 谢谢,这很有道理!我只使用 Python 一周左右 - 使用 VBA 已有多年 - 所以仍然试图找到自己的脚,并且与我习惯的世界相比,它可以做的所有事情都有点醉了。
  • @Patrick:不客气。别担心,不久你就会开始看到“一种明显的方法”。如果您还没有遇到过该短语,请输入 import this
  • @Patrick: P.S.关于使用 stackoverflow 的注意事项:如果此答案对您有所帮助,您可以通过单击左侧的勾号“接受”它(每个问题您只能接受一个答案)。
  • @Thomas: 喜欢'import this' ;-) 最好的学习方法总是先尝试一些东西,然后寻求一些建议;直接为您提供答案的人没有什么好处。
  • @Thomas:很抱歉再次打扰您。我试图提取我想要的数据,但我仍然以“ var gs_csv="HDR,PHYSICAL BM DATA,20110205,*\nPN,T_COTPS-4,1,20110205000000,490.000,20110205003000,490.000\nPN" 结尾而不是每次换行\n
【解决方案2】:

解决方案

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

【讨论】:

  • 很高兴你解决了。如果您只想保存它,则无需将其分开并使用 csv.writer。你可以做open("filename.csv","w").write(javascriptdata)
  • 这样更整洁!再次感谢...很高兴我注册了这个网站...在友好的帮助下让我想起了很多旧的新闻组
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 2014-04-13
  • 1970-01-01
  • 2018-09-30
  • 2014-02-16
  • 1970-01-01
相关资源
最近更新 更多