Извлечение значений из заголовка HTML и сохранение в виде файла CSV в Python

Все,

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

person Patrick A    schedule 06.02.2011    source источник
comment
Копия HTML-файла или ссылка на сайт помогут. Иначе это гадание в темноте :(   -  person Kevin Read    schedule 06.02.2011


Ответы (2)


Не превращайте его обратно в строку, а затем используйте замену. Это полностью лишает смысла использование 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(",")
person Thomas K    schedule 06.02.2011
comment
@Thomas - Спасибо, это имеет смысл! Я занимаюсь Python всего неделю или около того — использую VBA уже много лет — так что все еще пытаюсь встать на ноги и немного пьян от всего, что он может делать по сравнению с миром, к которому я привык. - person Patrick A; 06.02.2011
comment
@Patrick: Не за что. Не волнуйтесь, вскоре вы начнете видеть один очевидный способ сделать это. Если вы еще не встречали эту фразу, введите import this. - person Thomas K; 06.02.2011
comment
@ Патрик: P.S. Примечание об использовании stackoverflow: если этот ответ помог вам, вы можете принять его, щелкнув галочку слева (вы можете принять только один ответ на вопрос). - person Thomas K; 06.02.2011
comment
@Thomas: нравится «импортировать это» ;-) Лучший способ научиться — всегда сначала попробовать что-то, а затем попросить пару указателей; мало что можно получить, если кто-то даст вам ответ сразу. - person Patrick A; 06.02.2011
comment
@Thomas: извините, что снова вас беспокою. Я пытался извлечь нужные данные, но все равно получаю var gs_csv=HDR,PHYSICAL BM DATA,20110205,*\nPN,T_COTPS-4,1,20110205000000,490.000,20110205003000,490.000\nPN, а не каждый раз новую строку \n - person Patrick A; 06.02.2011
comment
@Thomas: Спасибо за внимание ... Я снова надел шапку мышления, принял ваши предложения и нашел решение - очень доволен и еще раз спасибо. Я опубликую решение (всегда рад поделиться) - person Patrick A; 07.02.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
person Patrick A    schedule 06.02.2011
comment
Рад, что у тебя получилось. Если вы просто хотите сохранить его, вам не нужно его отделять и использовать csv.writer. Вы можете просто сделать open("filename.csv","w").write(javascriptdata). - person Thomas K; 07.02.2011
comment
Это еще опрятнее! Еще раз спасибо... рад, что зарегистрировался на этом сайте... очень напоминает мне старые группы новостей с дружеской помощью - person Patrick A; 07.02.2011