代码之家  ›  专栏  ›  技术社区  ›  millimoose Tomasz Nurkiewicz

如何使用chained`css()`调用,以便第二次调用中的选择器使用第一次调用作为上下文?

  •  0
  • millimoose Tomasz Nurkiewicz  · 技术社区  · 6 年前

    我正在逐行处理一个表,需要嗅探 id 行数:

    <table id="tbl">
      <tr id="row_1">
        <td id="cell_1">...</td>
      </tr>
      <tr id="row_2">
        <td id="cell_2">...</td>
      </tr>
    </table>
    

    所以我的代码看起来像:

    def parse_table(self, response):
        rows = response.css('#tbl > tr')
        for row in rows:
            rowid = row.css('::attr(id)')
            if rowid.extract_first().startswith('row'):
                ...
    

    然而,这样,第二个呼叫 .css() 给我所有后代的身份证 row ,不仅仅是它的直系子女也就是说,对于上面的示例html,它返回 "cell_1" 以及 "row_1" . 如何确定链子的范围 css() 所以它只作用于指定行的直接子代?

    我试过用 :scope 伪类,但这似乎不受Scrapy支持,并且 :root 没有结果。

    或者,我可以得到 身份证件 属性而不通过CSS?

    1 回复  |  直到 6 年前
        1
  •  1
  •   gangabass    6 年前

    我可以向您展示如何将XPath用于相同的任务:

    def parse_table(self, response):
        for row in response.xpath('//*[@id="tbl"]/tr'):
            rowid = row.xpath('./@id').extract_first()
            if rowid.startswith('row'):
                ...