[英]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.