Scrapy:在ItemLoader的输出处理器中使用选择器(xpath)

时间:2018-10-10 21:10:07

标签: python-3.x scrapy

我不知道如何使我的逻辑适用于我的情况。

我想从事先不知道列数的表中提取行。 来源:

<article class="col-md-10 col-md-push-1">

  <b>Quantités recommandées (g/jour)  :</b><br>
  <br>
  <table border="1" width="80%">
    <colgroup>
      <col width="2*">
      <col width="1*">
      <col width="1*">
      <col width="1*">
    </colgroup>
    <tbody>
      <tr>
        <td align="center"><small><b>Poids du chat</b></small></td>
        <td align="center"><small><b>Maigre</b></small></td>

      </tr>
      <tr>
        <td align="center"><small>2 kg</small></td>
        <td align="center"><small>39 g</small></td>
      </tr>
      <tr>
        <td align="center"><small>3 kg</small></td>
        <td align="center"><small>52 g</small></td>
      </tr>
      <tr>
        <td align="center"><small>4 kg</small></td>
        <td align="center"><small>63 g</small></td>
      </tr>
      <tr>
        <td align="center"><small>5 kg</small></td>
        <td align="center"><small>74 g</small></td>
      </tr>
      <tr>
        <td align="center"><small>6 kg</small></td>
        <td align="center"><small>84 g</small></td>
      </tr>
      <tr>
        <td align="center"><small>7 kg</small></td>
        <td align="center"><small>94 g</small></td>
      </tr>
      <tr>
        <td align="center"><small>8 kg</small></td>
        <td align="center"><small>103 g</small></td>
      </tr>
      <tr>
        <td align="center"><small>9 kg</small></td>
        <td align="center"><small>112 g</small></td>
      </tr>
      <tr>
        <td align="center"><small>10 kg</small></td>
        <td align="center"><small>121 g</small></td>
      </tr>
    </tbody>
  </table>

</article>

要提取,我对此进行了硬编码:

feeding_box_table=response.xpath('//*[@id="feedingrecommendation-panel"]/div/article/table')
        feeding_recommendation=[]
        if feeding_box_table!=[]:
            for tr in feeding_box_table.xpath("tr"):
                tds=tr.xpath('td/small/b/text()|td/small/text()').extract()
                feeding_recommendation.append(tds)

但是,当我想使用项目加载器实现这种硬编码的解决方案时,它会变得棘手,因为我可以在feeding_box_table.xpath("tr")中进行迭代,因为out_processor中收集的值是str而不是对象,其中{ {1}}已收集。

我不知道处理器是否应该以这种方式实际使用。这就是为什么我尝试使用xpat做所有事情的原因:xpath

输出结果并不令人满意: 输出:table=response.xpath('//*[@id="feedingrecommendation-panel"]/div/article/table/td/small/text()') but the output is not structured.

这就是我要遍历["Poids du chat","Maigre","2 kg","39 g",...."10 kg", "121 g"]

的原因

所需的输出:<tr></tr>

任何帮助表示赞赏。 问候

1 个答案:

答案 0 :(得分:0)

我尝试过:

feeding_recommendation=[]
for tr in response.xpath('//*[@id="feedingrecommendation-panel"]/div/article/table/tr|//*[@id="feedingrecommendation-panel"]/div/article/table/tbody/tr'):
    tds=tr.xpath('td/small/b/text()|td/small/text()').extract()
    feeding_recommendation.append(tds)

l.add_value('feeding_recommendations_table',feeding_recommendation)

它确实起作用。但是我真的不确定我是否在这里充分利用ItemLoader。