2017-06-09 2 views
0

Ich habe ein Web-Scraping, und ich bekomme eine Tabelle, die ich in CSV schreiben möchte.Python Web-Scraping in CSV

Wenn ich es versuche, bekomme ich diese Meldung:

"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)"

Was ist mit diesem Code falsch? Ich benutze 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' nur einen Parameter nehmen – Arun

+0

ich die Fehlermeldung zu verstehen, aber ich weiß nicht, wie ich es zu korrigieren. – tardos93

+0

'encoding =" ascii ", errors =" ignore "' sind die Attribute, wenn Schreibfunktion nicht von Bytes, habe ich die Antwort unter – Arun

Antwort

1

Wie wäre es mit der Codierung Ihrer Strings, bevor Sie versuchen, sie zu schreiben?

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

Vergessen Sie auch nicht file.close()

+0

Es ist Arbeit, aber schauen Sie sich die Excel-Datei an. Es gibt 3 leere Zeile, und es gibt einige Format Problem + das wird nicht geliefert: S http://kepkezelo.com/images/r8iq7bhnsop59l5hrh02.png – tardos93

+0

Dann brauchen Sie wahrscheinlich UTF16 für HU. http://farmdev.com/talks/unicode/. Dein Code sollte also einfach utf8 zu utf16 wechseln. utf16_str = maindatatable.encode ('utf16') – BoboDarph

+0

Ahh, du bist cool, es funktioniert ^^ und kannst du meine erste Frage auch beantworten? Warum bekomme ich 3 leere Zeilen und warum nicht in verschiedene Spalten? – tardos93

1

Sie haben Parens verlegt. encoding und errors sind Parameter von file.write() nicht bytes().

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

Ich habe es versucht, aber es ist nicht Arbeit: "Traceback (letzten Anruf zuletzt): Datei "C: /Python27/megoldas3.py", Zeile 27, in file.write (bytes (header), encoding = "ascii", errors = "ignorieren") TypeError: write() nimmt keine Schlüsselwortargumente " – tardos93

+0

Übertragen Sie die Parameter 'encoding' und' errors' in Ihren Aufruf von 'open'. – BoarGules

0

Ich denke, das wird für Sie arbeiten. Entfernen Sie einfach encoding="ascii",errors="ignore" von Bytes

# 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

Ich versuchte mit Bytes (Header), aber es funktioniert nicht: \ "Traceback (letzten Aufruf zuletzt): Datei" C:/Python27/Megoldas3.py ", Zeile 28, in file.write (bytes (maindatable)) UnicodeEncodeError: 'ascii' Codec kann das Zeichen u '\ xe1' nicht in Position 9 codieren: Ordnungszahl nicht im Bereich (128)" – tardos93

+0

I aktualisiert diese Antwort, ihre Arbeit – Arun

0

Diese

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