5

我有一个 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>对应的 first 之前和之后的所有输入</table>。一些单元格还包含段落、粗体和脚本。主表的每一行不超过一个嵌套表。

如何提取它以获取行列表,其中每个元素包含普通(unicode 字符串)单元格的数据和每个嵌套表的行列表?嵌套层数不超过 1 层。

我尝试了 HTMLParse、PyParse 和 re 模块,但无法正常工作。我对 Python 很陌生。

4

3 回答 3

5

尝试美丽的汤

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

于 2009-06-03T14:07:04.163 回答
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))
于 2009-06-03T14:29:27.253 回答
2

如果 HTML 格式正确,您可以将其解析为 DOM 树并使用 XPath 提取您想要的表格。我通常使用lxml来解析 XML,它也可以解析 HTML

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

于 2009-06-03T14:13:23.853 回答