Usando BeautifulSoup para extraer el título de un enlace

Estoy tratando de extraer el título de un enlace usando BeautifulSoup. El código con el que estoy trabajando es el siguiente:

url = "http://www.example.com" source_code = requests.get(url) plain_text = source_code.text soup = BeautifulSoup(plain_text, "lxml") for link in soup.findAll('a', {'class': 'a-link-normal s-access-detail-page a-text-normal'}): title = link.get('title') print title 

Ahora, un elemento de link ejemplo contiene lo siguiente:

 

Introduction To Computation And Programming Using Python

Sin embargo, no se muestra nada después de ejecutar el código anterior. ¿Cómo puedo extraer el valor almacenado dentro del atributo de title de la etiqueta de ancla almacenada en el link ?

Bueno, parece que ha puesto dos espacios entre s-access-detail-page y a-text-normal , que a su vez, no puede encontrar ningún enlace coincidente. Intente con el número correcto de espacios, luego imprima el número de enlaces encontrados. Además, puede imprimir la etiqueta en sí – print link

 import requests from bs4 import BeautifulSoup url = "http://www.amazon.in/s/ref=nb_sb_noss_1?url=search-alias%3Daps&field-keywords=python" source_code = requests.get(url) plain_text = source_code.content soup = BeautifulSoup(plain_text, "lxml") links = soup.findAll('a', {'class': 'a-link-normal s-access-detail-page a-text-normal'}) print len(links) for link in links: title = link.get('title') print title 

Está buscando una cadena exacta aquí, utilizando varias clases. En ese caso, la cadena de clase debe coincidir exactamente , con espacios simples.

Vea la sección de clases Buscando por CSS en la documentación:

También puede buscar el valor de cadena exacto del atributo de clase:

 css_soup.find_all("p", class_="body strikeout") # [

]

Pero la búsqueda de variantes del valor de cadena no funcionará:

 css_soup.find_all("p", class_="strikeout body") # [] 

Te lo pasarás mejor buscando clases individuales:

 soup.find_all('a', class_='a-link-normal') 

Si debe coincidir con más de una clase, use un selector de CSS :

 soup.select('aa-link-normal.s-access-detail-page.a-text-normal') 

y no importa en qué orden enumeras las clases.

Manifestación:

 >>> from bs4 import BeautifulSoup >>> plain_text = u'

Introduction To Computation And Programming Using Python

' >>> soup = BeautifulSoup(plain_text) >>> for link in soup.find_all('a', class_='a-link-normal'): ... print link.text ... Introduction To Computation And Programming Using Python >>> for link in soup.select('aa-link-normal.s-access-detail-page.a-text-normal'): ... print link.text ... Introduction To Computation And Programming Using Python