У меня есть документ HTML, и я хочу вытащить таблицы из этого документа и возвратить их как массивы. Я изображаю 2 функции, та, которая находит все таблицы HTML в документе и вторую, которая превращает таблицы HTML в 2-мерные массивы.
Что-то вроде этого:
htmltables = get_tables(htmldocument)
for table in htmltables:
array=make_array(table)
Существует 2 выгоды: 1. Таблицы числа повседневно варьируются 2. Таблицы имеют все виды странного дополнительного форматирования, как полужирный и теги мигания, случайным образом добавленные.
Спасибо!
Используйте BeautifulSoup (я рекомендую 3.0.8
). Найти все таблицы тривиально:
import BeautifulSoup
def get_tables(htmldoc):
soup = BeautifulSoup.BeautifulSoup(htmldoc)
return soup.findAll('table')
Однако в Python массив одномерен и ограничен довольно элементарными типами в качестве элементов (целые числа, плавающие числа, что элементарно). Так что нет никакого способа втиснуть HTML-таблицу в массив
Python.
Может быть, вы имеете в виду Python list
? Это тоже одномерный список, но элементом может быть что угодно, так что вы можете иметь список списков (один подсписок на тег tr
, я представляю, содержащий один элемент на тег td
).
Это даст:
def makelist(table):
result = []
allrows = table.findAll('tr')
for row in allrows:
result.append([])
allcols = row.findAll('td')
for col in allcols:
thestrings = [unicode(s) for s in col.findAll(text=True)]
thetext = ''.join(thestrings)
result[-1].append(thetext)
return result
Возможно, это еще не совсем то, что вы хотите (не пропускает HTML-комментарии, элементы подсписков являются юникодовыми строками, а не байтовыми строками, и т.д.), но это будет легко настроить.
Один +1 задающему вопрос и еще один богу Пифону.
Хотел попробовать этот пример с использованием селекторов lxml и CSS.
Да, в основном это то же самое, что и в примере Алекса:
import lxml.html
markup = lxml.html.fromstring('''<html><body>\
<table width="600">
<tr>
<td width="50%">0,0,0</td>
<td width="50%">0,0,1</td>
</tr>
<tr>
<td>0,1,0</td>
<td>0,1,1</td>
</tr>
</table>
<table>
<tr>
<td>1,0,0</td>
<td>1,<blink>0,</blink>1</td>
<td>1,0,2</td>
<td><bold>1</bold>,0,3</td>
</tr>
</table>
</body></html>''')
tbl = []
rows = markup.cssselect("tr")
for row in rows:
tbl.append(list())
for td in row.cssselect("td"):
tbl[-1].append(unicode(td.text_content()))
pprint(tbl)
#[[u'0,0,0', u'0,0,1'],
# [u'0,1,0', u'0,1,1'],
# [u'1,0,0', u'1,0,1', u'1,0,2', u'1,0,3']]