2011-02-06 1 views
0

Все,Зачистка значения из заголовка HTML и сохранение как CSV файл в Python

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

Копия HTML файл или ссылка на сайт поможет. В противном случае его угадывание в темноте :( –

+0

@kread: Это в коде ;-) –

ответ

4

Не возвращайте его обратно в строку, а затем используйте замену. Это полностью поражает точку использования BeautifulSoup!

Попробуйте начать так:

scripttag = soup.head.findAll("script")[1] 
javascriptdata = scripttag.contents[0] 

Затем вы можете использовать:

  1. partition('=')[2] отрезать "вар 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(",") 
+0

@Thomas - Спасибо, это имело бы смысл! Я занимался только Pythoning в течение недели или около того - использовал VBA в течение многих лет - так что я все еще пытаюсь найти свои ноги и немного пьян во всех вещах, которые он может сделать, сравнивая мир, к которому я привык. –

+0

@Patrick: Добро пожаловать. Не волнуйтесь, скоро вы начнете видеть «один очевидный способ сделать это». Если вы еще не встретили эту фразу, введите 'import this'. –

+0

@Patrick: P.S. Заметка об использовании stackoverflow: если этот ответ вам помог, вы можете «принять» его, нажав галочку влево (вы можете принимать только один ответ на вопрос). –

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 
+0

Рад, что вы сработали. Если вы просто хотите его сохранить, вам не нужно его разделить и использовать csv.writer. Вы можете просто сделать 'open (" filename.csv "," w "). write (javascriptdata)'. –

+0

Это еще проще, спасибо еще раз ... рад, что я подписался на этот сайт ... напоминает мне много старых групп новостей с дружеской помощью –

Смежные вопросы