【问题标题】:Item not included in for loop made in Scrapy用 Scrapy 制作的 for 循环中不包含的项目
【发布时间】:2015-04-10 21:05:48
【问题描述】:

我认为可能有一个简单的解决方案来解决这个问题......我要做的就是提取文本,列出带有我的变量项目 ['genre'] 的流派类型,足够简单......但是,作为我正在提取的项目仅出现在我从一次抓取的页面上,当循环浏览其他项目(例如项目 ['艺术家'] 时,项目 ['流派'] 不包括在内。任何帮助,将不胜感激。这是我认为相关的代码。

def parse_item(self, response):#http://stackoverflow.com/questions/15836062/scrapy-crawlspider-doesnt-crawl-the-first-landing-page
    for info in response.xpath('//div[@class="entry vevent"] | //div[@id="page"]'):
        item = TutorialItem() # Extract items from the items folder.
        item ['artist'] = info.xpath('.//span[@class="summary"]//text()').extract() # Extract artist information.
        item ['date'] = info.xpath('.//span[@class="dates"]//text()').extract() # Extract date information.
        preview = ''.join(str(s)for s in item['artist'])
        item ['genre'] = info.xpath('.//div[@class="header"]//text()').extract()

真的希望这是有道理的,如果没有,请道歉!

【问题讨论】:

  • 发布相关的 HTML 或链接到您尝试抓取的页面..
  • allgigs.co.uk/whats_on/London/clubbing-1.html 你会看到我试图提取的单词clubbing overview。每页一次,而不是与其他项目并排
  • 我猜你不是在询问 XPath 来获取那个词,不是吗?那么再次提取那个词有什么问题呢?
  • 对不起,我不明白...我的问题是,当返回结果时,我得到了艺术家姓名,事件的日期。但是,项目类型返回空。它只在爬虫访问下一页时显示一次。这不好,因为我需要将信息添加到数据库中
  • 也许您应该简单地将item ['genre'] = info.xpath('.//div[@class="header"]//text()').extract() 语句放在循环之外

标签: python mysql xpath scrapy


【解决方案1】:

您只获得一次 genre 的原因是,response.xpath('//div[@class="entry vevent"] | //div[@id="page"]') 的返回列表将包含一个 div(with id="page") 和一个一堆 div (with class="entry vevent")

在遍历上述列表时,div[@id="page"] 将满足 genre xpath,

即,这个 div 包含另一个 div,它有一个 class="header"

In [1]: a = response.xpath('//div[@class="entry vevent"] | //div[@id="page"]')

In [2]: a[0].xpath('.//div[@class="header"]//text()').extract()
Out[2]: [u'Clubbing Overview']

In [3]: a[1].xpath('.//div[@class="header"]//text()').extract()
Out[3]: []

In [4]: a[2].xpath('.//div[@class="header"]//text()').extract()
Out[4]: []
...

另一方面 div[@class="entry vevent"],它不包含任何具有 class="header 的 div " 所以最终会导致得到空列表作为输出

有意义吗?

一种解决方案是将 genre xpath 放在循环之外,或者您可以将类型的 xpath 修改为

info.xpath('.//div[@class="header"]//text() | ./parent::div[@class="rows"]/preceding-sibling::div[@class="header"]//text()').extract()

【讨论】:

  • 很好的答案。我将对此进行更多研究。太感谢了!!我猜前面的兄弟姐妹从它刚刚抓取的链接中回来了?
【解决方案2】:

我想你在循环结束时错过了return item

【讨论】:

  • 我在循环结束时使用yield
猜你喜欢
  • 1970-01-01
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
相关资源
最近更新 更多