Scrapy: используйте селектор (xpath) в выходном процессоре ItemLoader - PullRequest
0 голосов
/ 11 октября 2018

Я не знаю, как заставить мою логику работать в моем случае.

Я хочу извлечь строку из таблицы, из которой заранее не знаю количество столбцов.Вот источник:

<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, а не объект, в котором собирается xpath.

Я не знаю, должны ли процессоры использовать этот способ на самом деле.Вот почему я попытался сделать все с помощью xpat, например: 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>

Желаемый результат: [["Poids du chat","Maigre"],["2 kg","39 g"],....["10 kg", "121 g"]]

Любая помощь приветствуется.С уважением

1 Ответ

0 голосов
/ 11 октября 2018

Я пробовал это:

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 здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...