在scrapy for python中运行for循环时检查xpath重复项

时间:2015-06-08 16:30:28

标签: python xpath scrapy

我通过scrapy抓取xml数据,同时我想查看重复项。为此,我使用以下代码:

    arr = []

    for tr in response.xpath('/html/body/table[1]'):
        if tr.xpath('tr/td/text()').extract() not in arr:
           arr.append(tr.xpath('tr/td/text()').extract()) 

    print arr

这会产生以下输出(演示数据):

[[u'test1', u'12', u'test2', u'12', u'test1', u'12', u'test2', u'12']]

但我希望得到以下输出:

[[test1, 12, test2, 12]]

所以,我想摆脱重复。谁能告诉我这里做错了什么?

提前Tnx

1 个答案:

答案 0 :(得分:0)

尝试:

list(
    chain(
    *list(
        { e : 1 for e in list(zip_longest(*([iter(tr)] * 2), fillvalue=''))}.keys()
    )))

它在重复的相同列表上创建一个iterable,因此它混合了两者的元素。然后我使用字典理解来删除从zip_longest()生成的重复元组。 chain使元组内的值变平,list()耗尽了迭代。

我嘲笑你的xpath命令的结果,因为你没有提供一个有效的完整例子。

from itertools import zip_longest, chain

#tr = response.xpath('/html/body/table[1]')
tr = ['test1', '12', 'test2', '12', 'test1', '12', 'test2', '12']

l = list(
    chain(
    *list(
        { e : 1 for e in list(zip_longest(*([iter(tr)] * 2), fillvalue=''))}.keys()
    ))) 
print(l)

它产生:

['test2', '12', 'test1', '12']