Új hozzászólás Aktív témák
-
adam0913
tag
Sziasztok!
Elakadtam egy problémával (jelzem nem vagyok nagy programozó )
A következő kis programot próbálnám összerakni:
-egy adott weboldalról legyen például ez az oldali , ahonnan napi szinten szeretnék adatokat kinyerni, amiket aztán adatbázisban tárolok.Ehhez szerintem praktikus a Request és a Beautifulsoup package-ket használni.
Van egy minta oldal, ahol táblázatból adja vissza a kért adatokat, a kódját bemásoltam, viszont ez sem fut le, "invalid syntax error-al" visszadobja (pedig installálva vannak a packagek). Ez a sor nem tetszik neki:
"for inmate in inmates:
print '{0}, {1}'.format(inmate['name'], inmate['age'])"A teljes kód itt: Kód-link
A kérdés, hogy mi lehet az oka annak, hogy nem fut le nálam, illetve mit kellene átalakítanom benne, hogy az általam linket példa oldal (napiárfolyamról) tudjunk adatokat kinyerni?
-
adam0913
tag
Erről a weboldalról szeretném kigyűjteni ezt a részét Python segítségével, amit aztán excelbe/sql-be továbbitok.
<tbody>
<tr>
<td class="valute"><b>CHF</b></td>
<td class="valutename">svájci frank</td>
<td class="unit">1</td>
<td class="value">284,38</td>
</tr>
<tr>
<td class="valute"><b>EUR</b></td>
<td class="valutename">euro</td>
<td class="unit">1</td>
<td class="value">308,54</td>
</tr>
<tr>
<td class="valute"><b>USD</b></td>
<td class="valutename">USA dollár</td>
<td class="unit">1</td>
<td class="value">273,94</td>
</tr>
</tbody>A következő error hibaüzenetet kapom: "There's an error in your program: unindent does not match any outer indentation level"
Mit rontottam el a kódban? Hogy tudom elérni hogy ezeket az értékeket szedjem ki ténylegesen?
A kódom a következő:import csv
import requests
from BeautifulSoup import BeautifulSoup
url = 'https://www.mnb.hu/arfolyamok'
response = requests.get(url)
html = response.content
soup = BeautifulSoup(html)
table = soup.find('tbody', attrs={'class': 'stripe'})
table = str(soup)
table = table.split("<tbody>")
list_of_rows = []
for row in table[1].findAll('tr')[1:]:
list_of_cells = []
for cell in row.findAll('td'):
text = cell.text.replace(' ', '')
list_of_cells.append(text)
list_of_rows.append(list_of_cells)
print list_of_rows
outfile = open("./inmates.csv", "wb")
writer = csv.writer(outfile)
writer.writerow(["Pénznem", "Devizanév", "Egység", "Forintban kifejezett érték"])
writer.writerows(list_of_rows)[ Szerkesztve ]
-
adam0913
tag
-
adam0913
tag
Kicsit más irányba mentem el, és egyszerűsítettem :
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,Penznem_forintban"
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"))Viszont ezt a hibaüzenetet adja vissza : "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)"Gondolom az utolsó soroknál lehet valami probléma, amikor csv-be szeretném kimenteni, mert ha printelem a maindata-t nagyon szépen kiadja azokat az adatokat, amikre szükségem van. Mit ronthattam el vele?
[ Szerkesztve ]
-
adam0913
tag
Sziasztok!
A következő kódot, hogyan tudom átalakítani úgy, hogy "," mentén elválasztva írja ki a sorokat az excelbe, és ne összefüggően (összesen 4 oszlopról van szó), illetve az utolsó 2 érték az egy szám, ami szintén ","-vel van elválasztva, viszont az egy cellába kellene hogy kerüljön. (283,45)
Itt a link : Kód+excel (Python 2.7)
-
adam0913
tag
válasz justmemory #1127 üzenetére
Az még jobb megoldás lenne, ha egyből SQL-be menteném, ott egyből külön cellákba rakná szerinted? (átírom a kódot, hogy sql-be mentse ki,megnézem)
Teljesen kezdő vagyok, leginkább a stackoverflowra támaszkodom
-
adam0913
tag
válasz justmemory #1129 üzenetére
MYSQL-t töltöttem le
Ezt nem értem, a table amit a web-scraping módszerrel nyertem ki az egy összefüggő egységes adatként látszik és aként is kezeli a python(?!). Tehát nincs külön neve a soroknak, oszlopoknak, hanem egységesen "maindatatable"-ként hivatkozok rá. Tehát ezt fel kellene dolgoznom egy ciklussal soronként, és ahol ","-őt talál, azokat az értékeket rakja be egy tömbbe vagy változóba, amit aztán msqlb-be már könnyebben tudok importálni? Ha igen, akkor ezt mégis hogyan lehetne kivitelezni? -
adam0913
tag
Sziasztok!
Lehetséges az, hogy egy webscraping módszerrel kihalászott értéket egy változóba rakom, és az értékre hivatkozva adattáblát hozok létre?
Csak hogy érthetőbb legyen :
name = soup.find('span', { "class" : "name"})
print nameEzzel megtaláltam azt a nevet, amivel szeretném létrehozni az adattáblát.
connection = MySQLdb.connect(host='localhost',
user='root',
passwd='1234',
db='database')
cursor = connection.cursor()
query = """
[B] "CREATE TABLE IF NOT EXISTS "+ name+ " name VARCHAR(120) [/B](
`Megnevezes` varchar(100) DEFAULT NULL,
`Ev1` varchar(100) DEFAULT NULL,
`Ev2` varchar(100) DEFAULT NULL,
`Ev3` varchar(100) DEFAULT NULL,
`Ev4` varchar(100) DEFAULT NULL,
`Ev5` varchar(100) DEFAULT NULL,
`ID` int(10) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8"""
cursor.execute(query)
connection.commit()
cursor.close()
connection = MySQLdb.connect(host='localhost',
user='root',
passwd='1234',
db='database')
cursor = connection.cursor()
query = """ load data local infile 'C:/Python27/output.csv'
into table " +name"
character set latin1
fields terminated by ';'
enclosed by '"'
lines terminated by '\r\n'
ignore 1 lines;
"""
cursor.execute(query)
connection.commit()
cursor.close()Próbáltam a "CREATE TABLE IF NOT EXISTS "+ name+ " name VARCHAR(120) -al, de biztos van erre valami más trükk. Lehetséges egyáltalán az, amit szeretnék?
[ Szerkesztve ]
-
adam0913
tag
válasz justmemory #1136 üzenetére
Nem hozza létre sajnos, ezért tettem ki, hátha valaki tud tanácsot adni, hogy mit hagyhattam ki
-
adam0913
tag
Hogyha több "ctable" nevű táblám is van, hogyan tudom az összeset kiíratni?
Ezzel csak az első sort írja ki.ctable = soup.find('table', { "class" : "ctable" })
datatable=[]
for record in ctable.find_all('tr'):
temp_data = []
for data in record.find_all('td'):
temp_data.append(data.text.encode('latin-1'))
datatable.append(temp_data) -
adam0913
tag
Nekem az lenne a problémám, hogy amikor csv-ből MYSQLdb-be íratok ki adatokat és autoincrementet használok primary ID-ként az 1000. sornál meg áll a történet, és nem tölti tovább
Ezt valaki tudja esetleg, hogy miért? Hiába állítok be INT-et, BIG INT-et, vagy bármit neki, 1000-ig szépen kilistázza, utána pedig meg áll (jelzem hiba üzenet nélkül).
A hozzá tartozó kódrészletem :
`ID` BIGINT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8""" -
Új hozzászólás Aktív témák
- Filmgyűjtés
- Amatőr csillagászat
- Futás, futópályák
- Nők, nőügyek (18+)
- Router gondok
- f(x)=exp(x): A laposföld elmebaj: Vissza a jövőbe!
- USB to S/PDif konverter a modern RIAA, elektroncsövekkel
- PlayStation 5
- Kínai, és egyéb olcsó órák topikja
- Kaspersky Antivirus és Internet Security Fórum
- További aktív témák...
Állásajánlatok
Cég: Ozeki Kft.
Város: Debrecen
Cég: Promenade Publishing House Kft.
Város: Budapest