css或xpath:选择前2个元素

时间:2014-07-23 07:38:15

标签: python xpath css-selectors scrapy

我练习Scrapy并且想问一个问题:

我要废弃的网站有这样的结构:

<td class="c3">
    <div class="text">
        <a class="title" href="https:// ">movie</a>
        <a  href="https:/ ">movieEN</a>
        <p><ins><a hpp="thisweek-guide" href="https:// ">see more</a></ins></p>
    </div>
</td>

但我只想要第一个2 href元素(movie和MovieEN)没有最后一个(见更多) 我怎么办? 这是我的代码而且没有工作

ssel.css("td.c3 a:nth-child(-n+3)::text").extract()

1 个答案:

答案 0 :(得分:2)

我看到两件事:

  • a:nth-child(-n+3)会选择元素的前3个孩子。

在您的情况下,它会选择所有3个a元素:前2个是<div class="text">的孩子1和2,最后一个是<ins>的第1个孩子

  • 我认为a:nth-child(-n+3)未正确翻译 an + b 形式中 n 的负值为cssselect(scrapy在内部使用cssselect)

检查一下:

>>> cssselect.HTMLTranslator().css_to_xpath('a:nth-child(-n+3)')
u"descendant-or-self::*/*[name() = 'a' and ((position() -3) mod -1 = 0 and position() >= 3)]"

应该是u"descendant-or-self::*/*[name() = 'a' and ((position() -3) mod -1 = 0 and position() <= 3)]"

我建议你使用CSS选择器和XPath的组合(你可以在scrapy中链接它们):

In [1]: import scrapy

In [2]: selector = scrapy.Selector(text="""
   ...: <td class="c3">
   ...:     <div class="text">
   ...:         <a class="title" href="https:// ">movie</a>
   ...:         <a  href="https:/ ">movieEN</a>
   ...:         <p><ins><a hpp="thisweek-guide" href="https:// ">see more</a></ins></p>
   ...:     </div>
   ...: </td>""")

In [3]: selector.css("td.c3 a:nth-child(-n+3)::text").extract()
Out[3]: []


In [4]: selector.css("td.c3").xpath("(.//a)[position() < last()]//text()").extract()
Out[4]: [u'movie', u'movieEN']

In [5]: 

或者,如果您只考虑<div class="text">的孩子:

In [8]: selector.css("td.c3 > * > a::text").extract()
Out[8]: [u'movie', u'movieEN']

In [9]: selector.css("td.c3 div.text > a::text").extract()
Out[9]: [u'movie', u'movieEN']