我目前正在尝试运行以下代码,但它始终仅抓取每个页面的第一个结果。知道可能是什么问题吗?

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from firstproject.items import xyz123Item
import urlparse
from scrapy.http.request import Request

class MySpider(CrawlSpider):
    name = "xyz123"
    allowed_domains = ["www.xyz123.com.au"]
    start_urls = ["http://www.xyz123.com.au/",]

    rules = (Rule (SgmlLinkExtractor(allow=("",),restrict_xpaths=('//*[@id="1234headerPagination_hlNextLink"]',))
    , callback="parse_xyz", follow=True),
    )

    def parse_xyz(self, response):
        hxs = HtmlXPathSelector(response)
        xyz = hxs.select('//div[@id="1234SearchResults"]//div/h2')
        items = []
        for xyz in xyz:
            item = xyz123Item()
            item ["title"] = xyz.select('a/text()').extract()[0]
            item ["link"] = xyz.select('a/@href').extract()[0]
            items.append(item)
            return items


Basespider版本可以很好地在首页上抓取所有必需的数据:

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from firstproject.items import xyz123

class MySpider(BaseSpider):
    name = "xyz123test"
    allowed_domains = ["xyz123.com.au"]
    start_urls = ["http://www.xyz123.com.au/"]


    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        titles = hxs.select('//div[@id="1234SearchResults"]//div/h2')
        items = []
        for titles in titles:
            item = xyz123Item()
            item ["title"] = titles.select("a/text()").extract()
            item ["link"] = titles.select("a/@href").extract()
            items.append(item)
        return items


对不起,审查。出于隐私原因,我不得不审查该网站。

第一个代码很好地爬行了页面,就像我希望的那样,但是它只提取了第一个项目的标题和链接。注意:在Google中使用“检查元素”的第一个标题的XPath是:
//*[@id="xyz123SearchResults"]/div[1]/h2/a
第二个是//*[@id="xyz123SearchResults"]/div[2]/h2/a
第三是//*[@id="xyz123SearchResults"]/div[3]/h2/a等。

我不确定div [n]位是否正在杀死它。我希望这是一个简单的解决方法。

谢谢

最佳答案

 for xyz in xyz:
            item = xyz123Item()
            item ["title"] = xyz.select('a/text()').extract()[0]
            item ["link"] = xyz.select('a/@href').extract()[0]
            items.append(item)
            return items


您确定退货项目的缩进吗?应该少一。

关于python - 只抓取每个页面的第一个结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20028954/

10-09 21:11
查看更多