2012-10-25 15 views
8

Ich versuche, die erste und dritte Spalte von this data table mit BeautifulSoup zu extrahieren. Aus dem Blick auf das HTML hat die erste Spalte einen <th> Tag. Die andere Spalte von Interesse hat als <td> Markierung. In jedem Fall war alles, was ich herausbekommen konnte, eine Liste der Spalte mit den Tags. Aber ich will nur den Text.Extrahieren ausgewählter Spalten aus einer Tabelle mit BeautifulSoup

table ist bereits eine Liste, so kann ich findAll(text=True) nicht verwenden. Ich bin nicht sicher, wie man die Auflistung der ersten Spalte in einer anderen Form erhält.

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

Ich glaube nicht, Sie werden in der Lage sein, die gesamte Spalte wie die HTML-Darstellung zu erhalten, ist zeilenbasierte (falsch sein könnte). Ich stelle mir vor, Sie könnten etwas approximieren, indem Sie die Zeilen durchlaufen und die entsprechende Spalte herausziehen und zu einer Datenstruktur Ihrer Wahl hinzufügen. – RocketDonkey

+0

Ich begann mit dem Versuch, aber konnte immer noch nicht den Text herausziehen. Ich werde meine Antwort aktualisieren, um diesen Teil hinzuzufügen. Vielleicht ist das ein einfacher Weg. – mac389

Antwort

22

Sie können diesen Code versuchen:

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 

Wie Sie den Code nur auf die URL verbindet sehen und bekommt die html und die BeautifulSoup findet die erste Tabelle, dann sind alle ‚tr‘ und wählt die erste Spalte aus, die das "th" ist, und die dritte Spalte, die ein "td" ist.

+0

Genau was ich getan hätte. Gute Antwort. – That1Guy

3

Zusätzlich zu @ Jonhkrs Antwort dachte ich, ich würde eine alternative Lösung posten, die mir einfiel.

#!/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 

Im Gegensatz zu jonhkr Antwort, die in die Webseite wählt, geht davon aus Mine, dass Sie es auf Ihrem Computer speichern und es als Kommandozeilen-Argument übergeben. Zum Beispiel: wenn

python file.py table.html 
0

Sie diesen Code versuchen können auch

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) 
Verwandte Themen