2017-06-12 46 views
0

我在Python 2.7.13上編寫了這個代碼,用於從網站上抓取數據表。如何將網頁抓取表導出爲具有多行的csv?

import urllib2 
from bs4 import BeautifulSoup 
import csv 
import os 

out=open("proba.csv","rb") 
data=csv.reader(out) 

def make_soup(url): 
    thepage = urllib2.urlopen(url) 
    soupdata = BeautifulSoup(thepage, "html.parser") 
    return soupdata 

maindatatable="" 
soup = make_soup("https://www.mnb.hu/arfolyamok") 

for record in soup.findAll('tr'): 
    datatable="" 
    for data in record.findAll('td'): 
     datatable=datatable+","+data.text 
    maindatatable = maindatatable + "\n" + datatable[1:] 

header = "Penznem,Devizanev,Egyseg,Penznemforintban" 
print maindatatable 

file = open(os.path.expanduser("proba.csv"),"wb") 

utf16_str1 =header.encode('utf16') 
utf16_str2 = maindatatable.encode('utf16') 
file.write(utf16_str1) 
file.write(utf16_str2) 
file.close() 

我想這跟接下來的4行導出爲CSV:

「Penznem Devaizanev Egyseg Penznemforintban」

的數據,它們之間用「」但最後兩個值是一行。 (283,45)

我該如何解決?

+1

,可以用[CSV](https://docs.python.org/2/library/csv.html)模塊中蟒。 –

回答

0

你不能直接避免最後昏迷,但

什麼,你可以簡單地做的是使用另一種seprator即;(分號) ,當你在EXEL打開文件,計算的選擇(;)分號作爲seprator和你會得到預期的結果!

import urllib2 
 
from bs4 import BeautifulSoup 
 
import csv 
 
import os 
 

 
out=open("proba.csv","rb") 
 
data=csv.reader(out) 
 

 
def make_soup(url): 
 
    thepage = urllib2.urlopen(url) 
 
    soupdata = BeautifulSoup(thepage, "html.parser") 
 
    return soupdata 
 

 
maindatatable="" 
 
soup = make_soup("https://www.mnb.hu/arfolyamok") 
 

 
for record in soup.findAll('tr'): 
 
    datatable="" 
 
    for data in record.findAll('td'): 
 
     datatable=datatable+";"+data.text 
 
    maindatatable = maindatatable + "\n" + datatable[1:] 
 

 
header = "Penznem;Devizanev;Egyseg;Penznemforintban" 
 
print maindatatable 
 

 
file = open(os.path.expanduser("proba.csv"),"wb") 
 

 
utf16_str1 =header.encode('utf16') 
 
utf16_str2 = maindatatable.encode('utf16') 
 
file.write(utf16_str1) 
 
file.write(utf16_str2) 
 
file.close()

+0

啊,謝謝你,它是一個好主意!我怎麼做4個不同的行?因爲現在這只是在行/數據上,由「;」分隔。如何使用這些數據創建一個arrey/block(因爲後來我想導入到MYSQL數據庫) – tardos93

+0

非常簡單,首先用'\ n'拆分datatable.split()方法,這樣你就可以將每一行都作爲item,然後按';'(分號)分割項目,你將得到列表包含每個colmn sepratly .. – DexJ