Очистка значений из заголовка HTML и сохранение в виде файла CSV в Python - PullRequest
0 голосов
/ 06 февраля 2011

Все,

Я только начал использовать 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()

Ответы [ 2 ]

4 голосов
/ 06 февраля 2011

Не превращайте его обратно в строку, а затем используйте замену.Это полностью лишает смысла использовать 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(",")
1 голос
/ 07 февраля 2011

РЕШЕНИЕ

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
...