2012-03-05 12 views
5

Acabo de empezar a aprender a usar la web usando Python. Sin embargo, ya he tenido algunos problemas.Web raspado de datos utilizando Python?

Mi objetivo es chatarra web los nombres de las diferentes especies de atún de fishbase.org (http://www.fishbase.org/ComNames/CommonNameSearchList.php?CommonName=salmon)

El problema: No puedo extraer todos los nombres de las especies.

Esto es lo que tengo hasta ahora:

import urllib2 
from bs4 import BeautifulSoup 

fish_url = 'http://www.fishbase.org/ComNames/CommonNameSearchList.php?CommonName=Tuna' 
page = urllib2.urlopen(fish_url) 

soup = BeautifulSoup(html_doc) 

spans = soup.find_all(

A partir de aquí, no sé cómo iba a ir sobre la extracción de los nombres de las especies. He pensado en el uso de expresiones regulares (es decir soup.find_all("a", text=re.compile("\d+\s+\d+")) para capturar los textos dentro de la etiqueta ...

Cualquier entrada será muy apreciada!

Respuesta

2

En cuanto a la página web, no estoy seguro exactamente qué información que desea extraer Sin embargo, tenga en cuenta que usted puede conseguir fácilmente el texto en una etiqueta con el atributo text:..

>>> from bs4 import BeautifulSoup 
>>> html = '<a>some text</a>' 
>>> soup = BeautifulSoup(html) 
>>> [tag.text for tag in soup.find_all('a')] 
[u'some text'] 
0

Si desea una solución a largo plazo, tratar scrapy es bastante simple y hace un montón de trabajo para usted. Es muy personalizable y extensible. Extraerá todas las URL que necesite utilizando xpath, que es m mineral agradable y confiable. Still scrapy le permite usar re, si lo necesita.

4

Es lo mismo que toma ventaja del hecho de que todos los nombres científicos (y sólo los nombres científicos) están en <i/> etiquetas:

scientific_names = [it.text for it in soup.table.find_all('i')] 

usando BS y expresiones regulares son dos enfoques diferentes para analizar una página web. El primero existe así que no tienes que molestarte tanto con el último.

Deberías leer lo que realmente hace BS, parece que estás subestimando su utilidad.

4

Lo que jozek sugiere es el enfoque correcto, pero no pude conseguir su fragmento de código para trabajar (pero es posible que sea porque no estoy ejecutando la versión beta de BeautifulSoup 4). Lo que funcionó para mí fue:

import urllib2 
from BeautifulSoup import BeautifulSoup 

fish_url = 'http://www.fishbase.org/ComNames/CommonNameSearchList.php?CommonName=Tuna' 
page = urllib2.urlopen(fish_url) 

soup = BeautifulSoup(page) 

scientific_names = [it.text for it in soup.table.findAll('i')] 

print scientific_names 
+2

hecho 'findAll' ha cambiado de nombre a' find_all' a cumplir con pep8. Más información [aquí] (http://www.crummy.com/software/BeautifulSoup/bs4/doc/#method-names). – jcollado

1

Gracias a todos ... yo era capaz de resolver el problema que estaba teniendo con este código:

import urllib2 
from bs4 import BeautifulSoup 

fish_url = 'http://www.fishbase.org/ComNames/CommonNameSearchList.php?CommonName=Salmon' 
page = urllib2.urlopen(fish_url) 
html_doc = page.read() 
soup = BeautifulSoup(html_doc) 

scientific_names = [it.text for it in soup.table.find_all('i')] 

for item in scientific_names: 
print item 
+2

No olvides aceptar la respuesta que más te ayudó como la respuesta correcta. – BioGeek

+0

... por lo que sería apropiado marcar la respuesta de Joe como la correcta ... esto ayuda a evitar que la gente salte para responder pensando que nadie lo ha resuelto. – CLaFarge

Cuestiones relacionadas