如何从HTML中提取嵌套表?

时间:2009-06-03 13:48:39

标签: python html html-table extract

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

答案 0 :(得分:5)

尝试beautiful soup

原则上你需要使用一个真正的解析器(Beaut.Soup是),正则表达式不能处理嵌套元素,因为计算机科学原因(有限状态机无法解析无上下文语法,IIRC)

答案 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))

答案 2 :(得分:2)

如果HTML格式正确,您可以将其解析为DOM树并使用XPath提取所需的表。我通常使用lxml来解析XML,it can parse HTML as well

用于取出第一个表的XPath将是“// table [1]”。