Extraer columnas seleccionadas de una tabla usando BeautifulSoup

Estoy tratando de extraer la primera y tercera columnas de esta tabla de datos usando BeautifulSoup. De mirar el HTML, la primera columna tiene una etiqueta

. La otra columna de interés tiene como etiqueta

. En cualquier caso, todo lo que he podido sacar es una lista de la columna con las tags. Pero, solo quiero el texto.

table ya es una lista, así que no puedo usar findAll(text=True) . No estoy seguro de cómo obtener la lista de la primera columna en otra forma.

 from BeautifulSoup import BeautifulSoup from sys import argv import re filename = argv[1] #get HTML file as a string html_doc = ''.join(open(filename,'r').readlines()) soup = BeautifulSoup(html_doc) table = soup.findAll('table')[0].tbody.th.findAll('th') #The relevant table is the first one print table 

Puedes probar este código:

 import urllib2 from BeautifulSoup import BeautifulSoup url = "http://www.samhsa.gov/data/NSDUH/2k10State/NSDUHsae2010/NSDUHsaeAppC2010.htm" soup = BeautifulSoup(urllib2.urlopen(url).read()) for row in soup.findAll('table')[0].tbody.findAll('tr'): first_column = row.findAll('th')[0].contents third_column = row.findAll('td')[2].contents print first_column, third_column 

Como puede ver, el código simplemente se conecta a la url y obtiene el html, y BeautifulSoup encuentra la primera tabla, luego todo el ‘tr’ y selecciona la primera columna, que es la ‘th’, y la tercera columna un ‘td’.

Además de la respuesta de @jonhkr, pensé que publicaría una solución alternativa que se me ocurrió.

  #!/usr/bin/python from BeautifulSoup import BeautifulSoup from sys import argv filename = argv[1] #get HTML file as a string html_doc = ''.join(open(filename,'r').readlines()) soup = BeautifulSoup(html_doc) table = soup.findAll('table')[0].tbody data = map(lambda x: (x.findAll(text=True)[1],x.findAll(text=True)[5]),table.findAll('tr')) print data 

A diferencia de la respuesta de jonhkr, que marca en la página web, la mía supone que la tiene guardada en su computadora y la pasa como un argumento de línea de comandos. Por ejemplo:

 python file.py table.html 

Puedes probar este código también

 import requests from bs4 import BeautifulSoup page =requests.get("http://www.samhsa.gov/data/NSDUH/2k10State/NSDUHsae2010/NSDUHsaeAppC2010.htm") soup = BeautifulSoup(page.content, 'html.parser') for row in soup.findAll('table')[0].tbody.findAll('tr'): first_column = row.findAll('th')[0].contents third_column = row.findAll('td')[2].contents print (first_column, third_column)