我对 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 依赖项的模块中?
预先感谢您的帮助,亚历克斯
这是一个生成器:
def process_row(row):
for cell in row.xpath('./td'):
print cell.text_content()
yield cell.text_content()
您调用它就好像您认为它返回一个列表一样。事实并非如此。在某些情况下,它behaves就像一个列表:
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
is返回第三行和所有后续行。这是[0]
最后那会让你陷入困境。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)