5

我是 lxml 新手,对 python 很陌生,找不到以下解决方案:

我需要导入一些具有 3 列和未定义行数的表,从第 3 行开始。

当任何行的第二列为空时,该行被丢弃并且表的处理被中止。

以下代码可以很好地打印表的数据(但之后我无法重用数据):

from lxml.html import parse

def process_row(row):  
    for cell in row.xpath('./td'):  
        print cell.text_content()  
        yield cell.text_content()  

def process_table(table):  
    return [process_row(row) for row in table.xpath('./tr')]

doc = parse(url).getroot()  
tbl = doc.xpath("/html//table[2]")[0]  
data = process_table(tbl)  

这只打印第一列:(

for i in data:  
    print i.next()

以下只导入第三行,不导入后续

tbl = doc.xpath("//body/table[2]//tr[position()>2]")[0]

任何人都知道一个奇特的解决方案,将第 3 行的所有数据放入 tbl 并将其复制到一个数组中,以便可以将其处理成一个不依赖 lxml 的模块?

提前感谢您的帮助,亚历克斯

4

2 回答 2

2

这是一个生成器:

def process_row(row):  
     for cell in row.xpath('./td'):  
         print cell.text_content()  
         yield cell.text_content() 

您正在调用它,就好像您认为它返回一个列表一样。它没有。在某些情况下,它的行为类似于列表:

print [r for r in process_row(row)]

但这只是因为生成器和列表都向for循环公开了相同的接口。在只评估一次的上下文中使用它,例如:

return [process_row(row) for row in table.xpath('./tr')]

只需为 的每个新值调用一次生成器的新实例row,返回产生的第一个结果。

所以这是你的第一个问题。你的第二个是你期望的:

tbl = doc.xpath("//body/table[2]//tr[position()>2]")[0]

给你第三行和所有后续行,它只设置tbl到第三行。好吧,调用返回的xpath 第三行和所有后续行。最后是[0]在搞砸你。

于 2009-10-16T21:04:38.943 回答
0

您需要使用循环来访问行的数据,如下所示:

for row in data:  
    for col in row:
        print col

像您一样调用 next() 一次只会访问第一项,这就是您看到一列的原因。

请注意,由于生成器的性质,您只能访问它们一次。如果您将调用更改process_row(row)list(process_row(row)),则生成器将转换为可以重用的列表。

更新:如果您只需要第三行,请使用data[2:]

于 2009-10-16T12:29:58.913 回答