XPath语法 - Scrapy

时间:2015-04-15 15:12:14

标签: python xpath

所以我一直在尝试使用Scrapy和Craigslist Jobs网站找到一个语法参考指南来完成一个基本的屏幕刮刀工具。这只是为了练习,因为我更多地学习Scrapy并进入更复杂的项目 - 跳页,填写搜索表单等。

这是Scrapy的代码:

 from scrapy.spider import BaseSpider
 from scrapy.selector import HtmlXPathSelector
 from craigslist_sample.items import CraigslistSampleItem

class MySpider(BaseSpider):
   name = "craig"
   allowed_domains = ["craigslist.org"]
   start_urls = ["https://gainesville.craigslist.org/search/jjj"]

   def parse(self, response):
    hxs = HtmlXPathSelector(response)
    titles = hxs.select("//p")
    items = []
    for titles in titles:
        item = CraigslistSampleItem()
        item ["title"] = titles.select("").extract()
        item ["link"] = titles.select("a/@href").extract()
        items.append(item)
    return items

显然,正如你所看到的,我有一个craiglist样本项python文件,其中包含标题和链接的元素。我似乎无法弄清楚第16行:我试图抓取的元素的XPath - 这是Craiglist发布的标题。

我对该链接的XPath有效,它位于

之下
 <p><a href='URL'> 

在craigslist帖子中。

craigslist发布标题位于:

 <p><span><span><a class="hdrlnk">Example Job Description</a>

我搞砸了它,我已经能够获得hdrlnk和'1'标题的输出。我不确定我做错了什么。任何帮助将不胜感激!

作为奖励,有谁知道我会如何告诉Scrapy转到下一页并运行相同的脚本?

谢谢!

1 个答案:

答案 0 :(得分:0)

你可以尝试一下,

BASE_URL = 'https://gainesville.craigslist.org'
titles = response.xpath('//p[@class="row"]')
for title in titles:
    # extracting the title
    name = title.xpath('.//a[@class="hdrlnk"]/text()').extract()
    # cleaning the data
    name = name[0].strip() if name else 'N/A'
    link = title.xpath('.//a[@class="hdrlnk"]/@href').extract()
    link = BASE_URL + link[0].strip() if link else 'N/A
    item = CraigslistSampleItem(title=name, link=link)
    yield items

如果你想要分页,那么完整的代码将会是,

def parse(self, response):
    BASE_URL = 'https://gainesville.craigslist.org'
    titles = response.xpath('//p[@class="row"]')
    for title in titles:
        # extracting the title
        name = title.xpath('.//a[@class="hdrlnk"]/text()').extract()
        # cleaning the data
        name = name[0].strip() if name else 'N/A'
        link = title.xpath('.//a[@class="hdrlnk"]/@href').extract()
        link = BASE_URL + link[0].strip() if link else 'N/A
        item = CraigslistSampleItem(title=name, link=link)
        yield items

    next_page = response.xpath('//a[@class="button next"]/@href').extract()
    if next_page:
        next_page_url = BASE_URL + next_page[0].strip()
        yield Request(url=next_page_url, callback=self.parse)