Как извлечь вложенные таблицы из HTML? - PullRequest
5 голосов
/ 03 июня 2009

У меня есть файл HTML (закодированный в utf-8). Я открываю это с codecs.open(). Файловая архитектура:

<html>
// header
<body>
  // some text
  <table>
    // some rows with cells here
    // some cells contains tables
  </table>
  // maybe some text here
  <table>
    // a form and other stuff
  </table>
  // probably some more text
</body></html>

Мне нужно получить только первую таблицу (откажитесь от таблицы с формой). Опустить все вводы до первого <table> и после соответствующего </table>. Некоторые ячейки содержат также абзацы, жирный шрифт и сценарии. В строке главной таблицы не более одной вложенной таблицы.

Как мне извлечь его, чтобы получить список строк, где каждый элемент содержит данные простой ячейки (строка в Unicode) и список строк для каждой вложенной таблицы? Там не более 1 уровня вложенности.

Я пробовал HTMLParse, PyParse и модуль re, но не могу заставить это работать. Я новичок в Python.

Ответы [ 3 ]

5 голосов
/ 03 июня 2009

Попробуйте красивый суп

В принципе, вам нужно использовать реальный парсер (которым является Beaut. Soup), регулярное выражение не может иметь дело с вложенными элементами по компьютерным причинам (конечные автоматы не могут анализировать контекстно-свободные грамматики, IIRC)

4 голосов
/ 03 июня 2009

Вам может понравиться lxml . Я не уверен, что действительно понял, что вы хотите сделать с этой структурой, но, возможно, этот пример поможет ...

import lxml.html

def process_row(row):
    for cell in row.xpath('./td'):
       inner_tables = cell.xpath('./table')
       if len(inner_tables) < 1:
           yield cell.text_content()
       else:
           yield [process_table(t) for t in inner_tables]

def process_table(table):
    return [process_row(row) for row in table.xpath('./tr')]

html = lxml.html.parse('test.html')
first_table = html.xpath('//body/table[1]')[0]

data = process_table(first_table))
2 голосов
/ 03 июня 2009

Если HTML правильно сформирован, вы можете проанализировать его в дереве DOM и использовать XPath для извлечения нужной таблицы. Я обычно использую lxml для анализа XML, а также может анализировать HTML .

XPath для извлечения первой таблицы будет "//table[1]".

...