用于在Scrapy中获取可选元素的Xpath表达式

时间:2014-03-29 12:49:57

标签: python xpath github scrapy

通过可选,我的意思是元素不存在。

我有一个GitHub的蜘蛛,我正在尝试获得代表的主要语言

<div class="repository-lang-stats">
    <ol class="repository-lang-stats-numbers">
      <li>
          <a href="/scrapy/scrapy/search?l=python">
            <span class="color-block language-color" style="background-color:#3581ba;"></span>
            <span class="lang">Python</span>
            <span class="percent">99.1%</span>
          </a>
      </li>
      <li>
          <span class="other">
            <span data-lang="Other" class="color-block language-color"></span>
            <span class="lang">Other</span>
            <span class="percent">0.9%</span>
          </span>
      </li>
    </ol>
</div>

在上面的示例(this repo的来源)中,我需要从第一个

获取&#34; Python &#34;
<span class="lang">

但是我的问题是某个回购,就像空的回购一样,没有

<span class="lang">

标签或

<ol class="repository-lang-stats-numbers">

标签。我该如何克服这个?

2 个答案:

答案 0 :(得分:1)

我会去查找语言列表,获取第一个列表项并检索第一个跨度,跳过可能的锚标记(对于某些低频语言似乎缺失它们)。

//ol[@class="repository-lang-stats-numbers"]/li[1]//span[@class="lang"]

空结果表示没有可用的语言数据。

一些评论:

  • 更具体地说,您可以将div[@class="repository-lang-stats"]作为第一轴步骤,但我认为没有必要。
  • 我们是matching class attributes, watch out
  • 要仅返回文本值,请将/text()附加到查询中。

无论如何: Github提供 API that also lets you query repository languages。更好地使用它而不是刮取网站。 API快速,易用且稳定;网站是经常更改的前端代码,会破坏您的XPath查询。

您可以通过访问一个特殊的URI(例如https://api.github.com/repos/scrapy/scrapy/languages)来查询它,该URI将返回一个可以轻松解析和排序的JSON对象:

{
  "Shell": 1733,
  "Python": 1195439,
  "CSS": 9681
}

答案 1 :(得分:0)

xpath是div/ol/li/a/span[@class="lang"]/text()。如果路径上缺少任何东西,它将不返回任何内容。