¿Datos de raspado web usando python?

Acabo de comenzar a aprender raspado web con Python. Sin embargo, ya me he encontrado con algunos problemas.

Mi objective es eliminar de la red 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( 

Desde aquí, no sé cómo me gustaría extraer los nombres de las especies. Pensé en usar soup.find_all("a", text=re.compile("\d+\s+\d+")) 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!

También podría aprovechar el hecho de que todos los nombres científicos (y solo los nombres científicos) están en las tags :

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

El uso de BS y RegEx son dos enfoques diferentes para analizar una página web. Lo primero existe, así que no tienes que preocuparte tanto por lo segundo.

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

Lo que Jozek sugiere es el enfoque correcto, pero no pude hacer que su fragmento funcionara (pero quizás 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 

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

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

Gracias a todos … Pude 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 

Si desea una solución a largo plazo, intente scrapy . Es bastante simple y hace mucho trabajo para ti. Es muy personalizable y extensible. Extraerá todas las URL que necesite utilizando xpath, que es más agradable y confiable. Todavía áspero le permite usar re, si lo necesita.