【问题标题】:How to extract nested tables from HTML?如何从 HTML 中提取嵌套表?
【发布时间】:2010-10-30 23:59:54
【问题描述】:

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

我只需要检索第一个表(丢弃带有表单的表)。省略第一个 &lt;table&gt; 之前和对应的 &lt;/table&gt; 之后的所有输入。一些单元格还包含段落、粗体和脚本。主表的每一行嵌套表不超过一个。

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

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

【问题讨论】:

  • 此问题的 'regex' 标签提出了错误的解决方案 - HTML 语法不规则,正则表达式可能给出错误的结果。

标签: python html html-table extract


【解决方案1】:

试试beautiful soup

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

【讨论】:

  • 感谢您的回答。看起来它会解决我的问题:)
  • 我花了半个晚上试图了解 B.Soup。并且做到了 - 它对我有用。再次感谢!
【解决方案2】:

如果 HTML 格式正确,您可以将其解析为 DOM 树并使用 XPath 提取您想要的表格。我一般用lxml解析XML,it can parse HTML as well

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    猜你喜欢
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 2020-11-28
    • 2018-05-12
    • 2021-10-11
    相关资源
    最近更新 更多