Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python、lxml和xpath-html表解析_Python_Xpath_Lxml - Fatal编程技术网

python、lxml和xpath-html表解析

python、lxml和xpath-html表解析,python,xpath,lxml,Python,Xpath,Lxml,我是lxml新手,对python非常陌生,无法找到以下问题的解决方案: 我需要导入几个表,其中包含3列和从第3行开始的未定义行数 当任何行的第二列为空时,该行将被丢弃,表的处理将中止 下面的代码可以很好地打印表的数据(但之后我无法重用数据): 这仅打印第一列:( 以下命令仅导入第三行,而不导入后续行 tbl = doc.xpath("//body/table[2]//tr[position()>2]")[0] 有谁知道一种奇特的解决方案,可以将第3行的所有数据都复制到tbl中,然后将其复

我是lxml新手,对python非常陌生,无法找到以下问题的解决方案:

我需要导入几个表,其中包含3列和从第3行开始的未定义行数

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

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

这仅打印第一列:(

以下命令仅导入第三行,而不导入后续行

tbl = doc.xpath("//body/table[2]//tr[position()>2]")[0]
有谁知道一种奇特的解决方案,可以将第3行的所有数据都复制到tbl中,然后将其复制到一个数组中,这样就可以将其处理到一个没有lxml依赖关系的模块中


提前感谢您的帮助,Alex

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

for row in data:  
    for col in row:
        print col
像这样调用next()一次将只访问第一项,这就是为什么会看到一列

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

更新:如果您只需要第三行和第三行,请使用
数据[2://code>

这是一个生成器:

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')]
只需为
行的每个新值调用生成器的一个新实例一次,返回生成的第一个结果

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

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

给您第三行和所有后续行,它只是将
tbl
设置为第三行。调用
xpath
将返回第三行和所有后续行。最后的
[0]
会把您弄得一团糟。

您能粘贴源文档(或部分)吗预期结果是什么?我不是python专家,但我擅长xpath,我想我可以帮助你。这里有源文档(仅在CET 06:00到22:00之间):预期结果:[[Premier',05',name1'],[u'Deuxi\xe8me',13',name2']]谢谢,嵌套循环和添加列表()调用确实做到了这一点,但它仍然不能与第二个xpath一起工作,我想这就是我需要的xpath我不清楚为什么需要第二个xpath,请参阅我答案的更新。我需要从第3行开始的所有表内容,第二个xpath只返回一行。当然,我已经按照您在更新中的建议做了,但我很想知道第二个xpath有什么问题,因为它将使我接下来几天的代码变得清晰谢谢你的回答。但是删除xpath末尾的[0]会引发exeption:AttributeError:“list”对象没有属性“xpath”。我不相信仅仅删除
[0]
从那句话的结尾就导致了这个错误。您更改了其他内容,或者后来又出现了错误。请原谅这个可怜的家伙,我必须承认我的python技能很可能与此有关……下面是困扰我的实际代码片段:
return [process_row(row) for row in table.xpath('./tr')]
tbl = doc.xpath("//body/table[2]//tr[position()>2]")[0]