如何在scrapy中使用XPath获取项目

时间:2016-04-10 14:34:08

标签: xpath scrapy web-crawler

我正在更新本教程,因为它已过时:\ n \ n
http://mherman.org/blog/2012/11/05/scraping-web-pages-with-scrapy/#.VwpeOfl96Ul

它应该获取非营利组织Craigslist上每个职位列表的链接和标题。链接被获取,但标题不是。

这是此元素的页面代码:

<span class="pl"> 
  <time datetime="2016-04-09 14:10" title="Sat 09 Apr 02:10:57 PM">Apr 9</time> 
  <a href="/nby/npo/5531527495.html" data-id="5531527495" class="hdrlnk">
  <span id="titletextonly">Therapist</span>

这是抓取工具的代码:

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

如果我检查Chrome中的元素并获取XPath,我会得到以下标题: // * [@ id =&#39; titletextonly&#39;],但这给了我整个标题列表,而不仅仅是链接的标题列表(在这种情况下,我应该得到&#39; / nby / npo /5531527495.html'用于链接,&#39;治疗师&#39;用于标题)

我知道这一行

item["title"] = titles.select("a/text()").extract()

需要更新,但是如果我输入//*[@id='titletextonly']我会得到每一个标题,所以我已经关闭了,但我不知道如何获得XPath以及#title titleonon&# 39;在&#39; href&#39;元件。

我是Scrapy和Xpath的新手,所以请在评论中说实话。

谢谢。

2 个答案:

答案 0 :(得分:1)

如下所示更改Xpath以遍历&#39; span&#39; 标记。

item["title"] = titles.select("a/span/text()").extract()

答案 1 :(得分:1)

a/text()只会选择a元素的直接子元素的文本元素。您想要的文本不是a元素的子文件;它在span

之内

我没有使用scrapy,但我建议尝试这个:

item["title"] = titles.select("a").extract()

这应该得到a元素的字符串值,其中包含其中的所有文本。

如果这不起作用,您也可以尝试:

item["title"] = titles.select("a//text()").extract()