with tutorial scraping real examples python html database web-scraping beautifulsoup

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(''&nbsp;'', '''') 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(''&nbsp;'', '''') 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)