我练习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()
答案 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']