【问题标题】:Using nth-child in Scrapy在 Scrapy 中使用 nth-child
【发布时间】:2017-04-01 13:35:45
【问题描述】:

我正在尝试使用 Python 工具 Scrapy 提取一些 html。

我的选择器如下:

#navigation > nav > div.js-accordion-menu-wrapper > ul li:nth-child(n+5):nth-child(-n+10) > a::attr(href)

由于某种原因,这根本不起作用。具体来说,似乎 'nth-child(-n + x) 不起作用。就像 Scrapy 可能不使用它或允许它一样。

谁能证实这一点?

【问题讨论】:

  • 你安装的是什么版本的cssselect? (这是 Scrapy 中用于将 CSS 选择器转换为 XPath 表达式的包)。 Version 1.0.0 修复了带有负 a 的 :nth-child(an+b)。另外,您能否提供示例 HTML 以及您需要使用 CSS 获取的预期数据?

标签: python css-selectors scrapy


【解决方案1】:

带有 cssselect 1.0.0 的 Scrapy 1.2.1 似乎按预期工作。

这是scrapy shell 会话示例:

In [1]: selector = scrapy.Selector(text="""<ul>
   ...:     <li>1</li>
   ...:     <li>2</li>
   ...:     <li>3</li>
   ...:     <li>4</li>
   ...:     <li>5</li>
   ...:     <li>6</li>
   ...:     <li>7</li>
   ...:     <li>8</li>
   ...:     <li>9</li>
   ...:     <li>10</li>
   ...:     <li>11</li>
   ...:     <li>12</li>
   ...: </ul>""")

In [2]: selector.css('ul li:nth-child(n+5)').extract()
Out[2]: 
['<li>5</li>',
 '<li>6</li>',
 '<li>7</li>',
 '<li>8</li>',
 '<li>9</li>',
 '<li>10</li>',
 '<li>11</li>',
 '<li>12</li>']

In [3]: selector.css('ul li:nth-child(n+5):nth-child(-n+10)').extract()
Out[3]: 
['<li>5</li>',
 '<li>6</li>',
 '<li>7</li>',
 '<li>8</li>',
 '<li>9</li>',
 '<li>10</li>']

我正在使用:

$ scrapy version -v
Scrapy    : 1.2.1
lxml      : 3.6.4.0
libxml2   : 2.9.4
Twisted   : 16.5.0
Python    : 3.5.0+ (default, Oct 11 2015, 09:05:38) - [GCC 5.2.1 20151010]
pyOpenSSL : 16.2.0 (OpenSSL 1.0.2g  1 Mar 2016)
Platform  : Linux-4.4.0-47-generic-x86_64-with-Ubuntu-16.04-xenial

$ pip freeze | grep cssselect
cssselect==1.0.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 2012-09-23
    • 1970-01-01
    • 2013-04-04
    • 2021-12-10
    • 1970-01-01
    • 2012-03-07
    相关资源
    最近更新 更多