Как извлечь вложенные таблицы из HTML?
-
09-09-2019 - |
Вопрос
У меня есть 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.
Решение
Пытаться Красивый суп
В принципе вам нужно использовать настоящий анализатор (который является Beaut. Soup), Regex не может иметь дело с вложенными элементами по соображениям компьютерных наук (конечные государственные машины не могут проанализировать контекстные грамматики, IIRC)
Другие советы
Вам может понравиться 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))
Если HTML хорошо сформирован, вы можете проанализировать его в дерево DOM и использовать XPath для извлечения таблицы, которую вы хотите. Я обычно использую LXML для анализа XML, и он также может проанализировать HTML.
XPath для вытягивания первой таблицы будет "// таблица [1].