Как преобразовать HTML-таблицу в массив в Python

У меня есть документ HTML, и я хочу вытащить таблицы из этого документа и возвратить их как массивы. Я изображаю 2 функции, та, которая находит все таблицы HTML в документе и вторую, которая превращает таблицы HTML в 2-мерные массивы.

Что-то вроде этого:

htmltables = get_tables(htmldocument)
for table in htmltables:
    array=make_array(table)

Существует 2 выгоды: 1. Таблицы числа повседневно варьируются 2. Таблицы имеют все виды странного дополнительного форматирования, как полужирный и теги мигания, случайным образом добавленные.

Спасибо!

13
задан Zach 20 May 2010 в 02:29
поделиться

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-комментарии, элементы подсписков являются юникодовыми строками, а не байтовыми строками, и т.д.), но это будет легко настроить.

18
ответ дан 1 December 2019 в 22:38
поделиться

Один +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']]
1
ответ дан 1 December 2019 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: