繁体   English   中英

谁能帮助我理解此代码(在lxml,python中解析HTML表)?

[英]Can anyone help me understand this code (HTML table parsing in lxml, python)?

背景:我需要在python中为具有不同colspans和rowpans的HTML表编写一个html表解析器。 经过一番研究,我偶然发现了这颗宝石 它适用于没有古怪的colspan和rowpans的简单情况,但是我遇到了一个错误。 代码假定如果一个元素的colspan为3,则它属于三个不同的表头,而实际上它仅属于colspan位于其中心的表头。 有关示例,请访问http://en.wiktionary.org/wiki/han#Swedish (在瑞典语部分下打开变形表)。 代码错误地返回“ hans”(中性第三人称男性)属于所有格常见的第三人称男性和拥有多名第三人称的男性,因为它的colspan为3。我尝试将支票添加到table_to_2d_dict如果colspan > 1将创建一个计数器,并且仅在计数器等于colspan // 2 + 1时才将元素计数为标头的一部分(这将返回range(1,colspan + 1)这是应该计为元素的表头的值。 但是,当我在下面的代码中指定的位置实施此检查时,它不起作用。 老实说,这可能是由于我对代码的工作原理缺乏了解,所以...

问题:如上所述,有人可以解释此代码的作用以及为什么会出错吗? 如果有人可以实施一个很棒的修复程序,但是现在我主要关心的是理解代码。 谢谢

以下是添加了注释的代码,以突出显示我理解的代码部分和我不理解的部分。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from collections import defaultdict


def table_to_list(table):
    dct = table_to_2d_dict(table)
    return list(iter_2d_dict(dct))


def table_to_2d_dict(table):
    result = defaultdict(lambda : defaultdict(str))
    for row_i, row in enumerate(table.xpath('./tr')): #these double for loops iterate over each element in the table
        for col_i, col in enumerate(row.xpath('./td|./th')):
            colspan = int(col.get('colspan', 1)) #gets colspan attr of the element, if none assumes it's 1
            rowspan = int(col.get('rowspan', 1)) #gets rowspan attr of the element, if none assumes it's 1
            col_data = col.text_content() #gets raw text inside element

            #WHAT DOES THIS DO? :(
            while row_i in result and col_i in result[row_i]: 
                col_i += 1
            for i in range(row_i, row_i + rowspan):
                for j in range(col_i, col_i + colspan):
                    result[i][j] = col_data
    return result

#what does this do? :(
def iter_2d_dict(dct):
    for i, row in sorted(dct.items()):
        cols = []
        for j, col in sorted(row.items()):
            cols.append(col)
        yield cols


if __name__ == '__main__':
    import lxml.html
    from pprint import pprint

    doc = lxml.html.parse('tables.html')
    for table_el in doc.xpath('//table'):
        table = table_to_list(table_el)
        pprint(table)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM