避免在scrapy上

时间:2018-04-21 17:28:32

标签: python web-scraping scrapy

我正在从course talk页面中删除MOOC数据,而我在清理某些字段时遇到问题,E.G。大学名称。

从上面的链接我想得到:麻省理工学院

这是我用于该字段的xpath:

response.xpath('//*[@class="course-info__school__name"]//text()').extract()

这里的问题是我从中获取重复值和空字符串:

[u'\n            ',
 u'University:\xa0',
 u'\n            Massachusetts Institute of Technology\n        ',
 u'\n            ',
 u'University:\xa0',
 u'\n            Massachusetts Institute of Technology\n        ']

3 个答案:

答案 0 :(得分:1)

原因在于有两个div,类名为course-info__school__name

a screen shot

因此,为了避免重复,您可以更改xpath,以便它只选择类名为course-info__school__name的第一个div元素

response.xpath('(//div[@class="course-info__school__name"])[1]//text()').extract()

将为您提供

的结果
['\n            ', 
 'University:\xa0', 
 '\n            Massachusetts Institute of Technology\n        ']

希望它有所帮助!

答案 1 :(得分:1)

您可以使用span(排除内部子跨节点)函数和not函数跳过内部normalize-space以跳过仅限空格的文本字符串和干净文本:

//*[@class="course-info__school__name"]/text()[not(self::span)][normalize-space()]

结果你应该得到两个大学名称相同的字符串:

[u'Massachusetts Institute of Technology',
 u'Massachusetts Institute of Technology']

您可以使用python set仅获取唯一名称:

>>> l = [u'Massachusetts Institute of Technology',
...      u'Massachusetts Institute of Technology']
>>> set(l)
set([u'Massachusetts Institute of Technology'])

如果你只需要第一个div的内容,你可以通过索引1获得它只有xpath:

(//*[@class="course-info__school__name"])[1]/text()[not(self::span)][normalize-space()]

答案 2 :(得分:0)

您可以尝试通过这种方式始终获取唯一值。

set(response.xpath('//*[@class="course-info__school__name"]//text()').extract())