2017-06-09 4 views
0

J'ai fait un web-grattage, et je reçois une table que je veux écrire en CSV.Python web-scraping dans csv

Lorsque je tente, je reçois ce message:

"Traceback (most recent call last):

File "C:/Python27/megoldas3.py", line 27, in <module>
file.write(bytes(header,encoding="ascii",errors="ignore")) TypeError:
str() takes at most 1 argument (3 given)"

Quel est le problème avec ce code? J'utilise Python 2.7.13.

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") 
file.write(bytes(header,encoding="ascii",errors="ignore")) 
file.write(bytes(maindatatable,encoding="ascii",errors="ignore")) 
+0

'bytes' prendra un seul paramètre – Arun

+0

je comprends le message d'erreur, mais je ne sais pas comment je dois corriger. – tardos93

+0

'encoding =" ascii ", errors =" ignorer "' sont les attributs si écrire la fonction pas de bytes, j'ai posté la réponse ci-dessous – Arun

Répondre

1

Comment coder vos chaînes avant d'essayer de les écrire?

utf8_str = maindatatable.encode('utf8') 
file.write(utf8_str) 

Aussi ne pas oublier de file.close()

+0

C'est un travail, mais regardez le fichier Excel. Il y a 3 lignes vides, et il y a un problème de format + ce n'est pas livré: S http://kepkezelo.com/images/r8iq7bhnsop59l5hrh02.png – tardos93

+0

Alors vous avez probablement besoin d'utf16 pour HU. http://farmdev.com/talks/unicode/. Donc votre code devrait simplement passer de utf8 à utf16. utf16_str = maindatatable.encode ('utf16') – BoboDarph

+0

Ahh, vous êtes cool, son travail ^^ et pouvez-vous répondre à ma première question aussi? pourquoi je reçois 3 rangs vides et pourquoi ne pas placer dans des colonnes différentes? – tardos93

1

Vous avez égaré parens. encoding et errors sont les paramètres de file.write() et non bytes().

file.write(bytes(header),encoding="ascii",errors="ignore") 
+0

J'ai essayé, mais ce n'est pas de travail: "Traceback (dernier appel dernier): Fichier "C: /Python27/megoldas3.py", ligne 27, en file.write (octets (en-tête), encoding = "ascii", errors = "ignore") TypeError: write() ne prend aucun argument " – tardos93

+0

Transférez les paramètres 'encoding' et' errors' à votre appel à 'open'. – BoarGules

0

Je pense que cela fonctionnera pour vous. Il suffit de retirer encoding="ascii",errors="ignore" d'octets

# import re 
# data = [['revenue', 'margins'], ['revenue', 'liquidity'], ['revenue', 'ratio'], ['revenue', 'pricing'], ['revenue', 'assets'], ['revenue', 'recent trends']] 
# with open('a.txt') as f: 
# txt = f.read() 
# for d in data: 
#  c1 = re.findall(d[0],txt) 
#  c2 = re.findall(d[1],txt) 
#  if c1 and c2: 
#   print {c1[0]:len(c1),c2[0]:len(c2)} 


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") 
file.write(header.encode('utf-8').strip()) 
file.write(maindatatable.encode('utf-8').strip()) 
+0

J'ai essayé avec octets (en-tête), mais ce n'est pas le travail: \ "Traceback (dernier appel dernier): Fichier" C:/Python27/megoldas3.py ", ligne 28, dans file.write (octets (maindatatable)) UnicodeEncodeError: le codec 'ascii' ne peut pas encoder le caractère 'xe1' en position 9: ordinal pas dans la plage (128)" – tardos93

+0

J'ai mis à jour cette réponse, son travail – Arun

0

Cela devrait fonctionner

file.write(bytes(header.encode('ascii','ignore'))) 
file.write(bytes(maindatatable.encode('ascii','ignore')))