【问题标题】:python, lxml and xpath - html table parsingpython、lxml 和 xpath - html 表解析
【发布时间】:2025-12-12 23:35:01
【问题描述】:

我是 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 的模块?

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

【问题讨论】:

  • 您能粘贴源文档(或部分)和预期结果吗?我不是python方面的专家,但我很擅长xpath,我想我可以帮助你。
  • 源文档可在此处获得(仅在欧洲中部时间 06:00 到 22:00 之间):tinyurl.com/yj4corh
  • 预期结果:[['Premier', '05', 'name1'], [u'Deuxi\xe8me', '13', 'name2']]

标签: python xpath lxml


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 谢谢,嵌套循环和添加 list() 调用确实起到了作用。但它仍然不适用于第二个 xpath,这是我需要的(我猜)
  • 我不清楚您为什么需要第二个 xpath,请参阅我的答案的更新。
  • 我需要从第3行开始的所有表格内容,第二个xpath只返回一行。当然,我已经完成了您在更新中建议的操作,但我很想知道第二个 xpath 出了什么问题,因为它会使我接下来几天的代码更干净
【解决方案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] 搞砸了你。

【讨论】:

  • 感谢您的回答。但是删除 xpath 末尾的 [0] 会引发异常:AttributeError: 'list' object has no attribute 'xpath'
  • 我不相信仅仅从该语句的末尾删除 [0] 会导致该错误。您更改了其他内容,或者稍后会引发错误。
  • 原谅那个可怜的灵魂,我不得不承认我的python技能很可能涉及到......这是实际的代码sn-p窃听我:pastebin.com/m522b6970