tutorial - ¿Cómo puedo leer estas células de un código html con python web-raspado?
web scraping tutorial (1)
Tiene un problema de space
en su código de la línea 18 for cell in row.findAll(''td''):
en la línea 20 list_of_cells.append(text)
. Aquí está el código fijo:
import csv
import requests
from bs4 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)
Pero, después de ejecutar este código, se encontrará con otro problema, que es un error de codificación de caracteres. Se leerá " SyntaxError: Non-ASCII character ''/xc3'' in file testoasd.py on line 27, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
"
¿Cómo arreglar eso? Lo suficientemente simple ... agregue el shebang # -*- coding: utf-8 -*-
en la parte superior de su código (1ra línea). Debería arreglarlo.
EDITAR: Me acabo de dar cuenta de que estás usando BeautifulSoup de forma incorrecta y de que también lo está importando mal. He corregido la importación from bs4 import BeautifulSoup
y cuando uso BeautifulSoup, también necesita especificar un analizador. Asi que,
soup = BeautifulSoup(html)
se convertiría :
soup = BeautifulSoup(html, "html.parser")
Quiero raspar las informaciones de precios de intercambio de este sitio web y luego llevarlo a una base de datos: https://www.mnb.hu/arfolyamok
Necesito esta parte de html:
<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>
Es por eso que escribí un código, pero algo está mal con él. ¿Cómo puedo solucionarlo, donde tengo que cambiarlo? Solo necesito los datos de "valor", "nombre de valor", "unidad" y "valor". Estoy trabajando con Python 2.7.13 en Windows 7.
El mensaje de error es el siguiente: "Hay un error en su programa: unindent no coincide con ningún nivel externo de sangría"
El código está aquí:
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)