如何提取HTML中的嵌套表格?

5 投票
3 回答
3915 浏览
提问于 2025-04-15 12:01

我有一个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 个回答

2

如果你的HTML代码格式正确,你可以把它解析成一个DOM树,然后用XPath来提取你想要的表格。我通常使用lxml来解析XML,而它也可以解析HTML

要提取第一个表格,可以使用的XPath是"//table[1]"。

4

你可能会喜欢 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))
5

试试 Beautiful Soup 这个工具吧。

简单来说,你需要用一个真正的解析器(而Beautiful Soup就是这样一个工具)。正则表达式处理不了嵌套的元素,这是因为一些计算机科学的原因(如果我没记错的话,有限状态机无法解析上下文无关的语法)。

撰写回答