2012-10-25 20 views
8

BeautifulSoupを使用してthis data tableの最初と3番目の列を抽出しようとしています。 HTMLを見ると、最初の列には<th>というタグがあります。関心のある他の列には<td>というタグがあります。いずれにしても、私が手に入れたのは、タグ付きの列のリストだけです。しかし、私はそのテキストがほしいだけです。BeautifulSoupを使用してテーブルから選択した列を抽出する

tableはすでにリストになっていますので、私はfindAll(text=True)を使用できません。私は別の形式で最初の列のリストを取得する方法がわかりません。

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

は、行ベースの(しかし間違っている可能性があります)。私はあなたが行を反復し、対応する列を引き出し、それをあなたが選んだデータ構造に追加することによって、何かを近似できると思います。 – RocketDonkey

+0

私はそれを試み始めたが、まだテキストを引き出すことができなかった。私はその部分を含めるために私の答えを更新します。たぶん、簡単な方法です。 – mac389

答えて

22

あなたはこのコードを試すことができます:あなたは、コードだけでURLに接続し、HTMLを取得し、BeautifulSoupは、すべての「TR」は、最初のテーブルを見つけ見ることができるように

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 

を'th'である第1の列と 'td'である第3の列を選択する。

+0

私は何をしたでしょうか。いい答えだ。 – That1Guy

3

@ jonhkrの回答に加えて、私は思いついた解決策を投稿すると思っていました。ウェブページにダイヤルjonhkrの答えとは異なり

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

、鉱山は、あなたがそれをコンピュータに保存し、コマンドライン引数として渡していることを前提としています。たとえば:あなたはこのコードを試すことができます

python file.py table.html 
0

も、私はあなたがHTML表現として列全体を取得することができます信じていません

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)