2012-10-25 20 views
8

Próbuję wyodrębnić pierwszą i trzecią kolumnę this data table przy użyciu BeautifulSoup. Patrząc na HTML pierwsza kolumna ma tag <th>. Druga kolumna zainteresowania ma znacznik <td>. W każdym razie wszystko, co udało mi się wydostać, to lista kolumn z tagami. Ale ja chcę tylko tekst.Wyodrębnianie wybranych kolumn z tabeli za pomocą BeautifulSoup

table jest już listą, więc nie mogę użyć findAll(text=True). Nie wiem, jak uzyskać listę pierwszej kolumny w innej formie.

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

Nie wierzę, że będziesz w stanie uzyskać całą kolumnę jako reprezentację HTML jest wiersz oparte (choć może być źle). Wyobrażam sobie, że możesz zbliżyć się do czegoś, powtarzając wiersze i wyciągając odpowiednią kolumnę, dodając ją do wybranej struktury danych. – RocketDonkey

+0

Zacząłem od próby, ale nadal nie mogłem wyciągnąć tekstu. Zaktualizuję moją odpowiedź, aby uwzględnić tę część. Może to łatwiejsza droga. – mac389

Odpowiedz

22

Można spróbować tego kodu:

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 

Jak widać kod po prostu łączy się z adresem URL i dostaje html, a BeautifulSoup znajdzie pierwszy stół, wtedy wszystkie „tr” i wybiera pierwszą kolumnę, która jest "th", i trzecią kolumnę, która jest "td".

+0

Dokładnie to, co bym zrobił. Dobra odpowiedź. – That1Guy

3

Oprócz odpowiedzi @ jonhkr pomyślałem, że dodam alternatywne rozwiązanie, które wymyśliłem.

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

przeciwieństwie odpowiedź jonhkr, który wykręca na stronie internetowej, mój zakłada, że ​​masz go zapisać na komputerze i przekazać go jako argument wiersza poleceń. Na przykład:

python file.py table.html 
0

można spróbować tego kodu również

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) 
Powiązane problemy