2012-10-25 6 views
8

Sto cercando di estrarre la prima e la terza colonna di this data table utilizzando BeautifulSoup. Dall'osservazione dell'HTML, la prima colonna ha un tag <th>. L'altra colonna di interesse ha come tag <td>. In ogni caso, tutto quello che sono riuscito a ottenere è un elenco della colonna con i tag. Ma, voglio solo il testo.Estrazione di colonne selezionate da una tabella utilizzando BeautifulSoup

table è già un elenco, quindi non è possibile utilizzare findAll(text=True). Non sono sicuro di come ottenere l'elenco della prima colonna in un altro formato.

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 
+0

Non credo che sarete in grado di ottenere l'intera colonna come la rappresentazione HTML è basata su file (potrebbe essere sbagliato però). Immagino che potresti approssimare qualcosa facendo scorrere le righe e tirando fuori la colonna corrispondente, aggiungendola a una struttura dati di tua scelta. – RocketDonkey

+0

Ho iniziato provandolo ma non riuscivo ancora a tirare fuori il testo. Aggiornerò la mia risposta per includere quella parte. Forse è una strada più facile da percorrere. – mac389

risposta

22

Si può provare questo codice:

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 

Come si può vedere il codice si collega solo per l'url e ottiene il codice html, e il BeautifulSoup trova la prima tabella, poi tutto il 'tr' e seleziona la prima colonna, che è il 'th', e la terza colonna, che è un 'td'.

+0

Esattamente quello che avrei fatto. Buona risposta. – That1Guy

3

In aggiunta alla risposta di @ jonhkr ho pensato di pubblicare una soluzione alternativa che mi è venuta in mente.

#!/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 differenza di risposta di jonhkr, che compone nella pagina web, il mio si presuppone che salvare sul computer e passarlo come argomento della riga di comando. Per esempio:

python file.py table.html 
0

si può provare questo codice anche

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)