2012-10-25 36 views
8

Tôi đang cố gắng trích xuất các cột đầu tiên và thứ ba của this data table bằng cách sử dụng BeautifulSoup. Từ việc xem HTML, cột đầu tiên có thẻ <th>. Cột quan tâm khác có dạng là <td>. Trong mọi trường hợp, tất cả những gì tôi có thể thoát ra là danh sách cột có các thẻ. Nhưng, tôi chỉ muốn văn bản.Trích xuất các cột đã chọn từ một bảng bằng cách sử dụng BeautifulSoup

table đã là danh sách nên tôi không thể sử dụng findAll(text=True). Tôi không chắc chắn làm thế nào để có được danh sách của cột đầu tiên trong một hình thức khác.

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

Tôi không tin rằng bạn sẽ có thể để có được toàn bộ cột như các đại diện HTML là hàng dựa trên (có thể là sai mặc dù). Tôi tưởng tượng bạn có thể ước tính một cái gì đó bằng cách lặp qua các hàng và kéo ra cột tương ứng, thêm nó vào một cấu trúc dữ liệu mà bạn chọn. – RocketDonkey

+0

Tôi bắt đầu bằng cách cố gắng nhưng vẫn không thể kéo ra văn bản. Tôi sẽ cập nhật câu trả lời của tôi để bao gồm phần đó. Có lẽ đó là một cách dễ dàng hơn để đi. – mac389

Trả lời

22

Bạn có thể thử mã này:

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 

Như bạn có thể thấy mã chỉ kết nối với url và nhận được html, và BeautifulSoup thấy bảng đầu tiên, sau đó tất cả các 'tr' và chọn cột đầu tiên, là cột 'th' và cột thứ ba, là cột 'td'.

+0

Chính xác những gì tôi đã làm. Câu trả lời tốt. – That1Guy

3

Ngoài câu trả lời của @ jonhkr, tôi nghĩ tôi đã đăng một giải pháp thay thế mà tôi đã đưa ra.

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

Không giống như câu trả lời jonhkr, mà quay vào trang web, tôi giả định rằng bạn có nó lưu trên máy tính của bạn và vượt qua nó như là một đối số dòng lệnh. Ví dụ:

python file.py table.html 
0

bạn có thể thử mã này cũng

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) 
Các vấn đề liên quan