Извлечение выбранных столбцов из таблицы с помощью BeautifulSoup

Я пытаюсь извлечь первый и третий столбцы в этой таблице данных С помощью BeautifulSoup. Глядя на HTML первый столбец <th> тег. Другая колонка интереса имеет as <td> тег. В любом случае, все, что я смог получить, это список столбца с тегами. Но я просто хочу текст.

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

3 ответов


вы можете попробовать этот код:

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

Как вы можете видеть, код просто подключается к url и получает html, а BeautifulSoup находит первую таблицу, затем все " tr "и выбирает первый столбец, который является "th", и третий столбец, который является "td".


в дополнение к ответу @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

В отличие от ответа jonhkr, который набирает номер на веб-странице, Мой предполагает, что у вас есть его сохранить на вашем компьютере и передать его в качестве аргумента командной строки. Например:

python file.py table.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)