Как извлечь пары ключ-значение в dict, если присутствуют другие теги? - PullRequest
0 голосов
/ 23 декабря 2018

Я пытаюсь извлечь пары ключ / значение {1,2} из таблицы HTML с помощью python и вытянуть их в словарь.

Элементы таблицы выглядят не всегда одинаково, что является причиноймой вопрос.

Минимальный пример:

  <div class="grabme">
  <table>
     <tbody>

        <tr>
           <td colspan="2">
              <p class="1st 2nd 3rd">
                 Box Headline</p>
           </td>
        </tr>

        <tr>
           <td><strong>First Key</strong></td>
           <td><span>Value</span></td>
           <script>
           </script>
        </tr>

        <tr>
              <td><strong>2. Key</strong></td>
              <td><a>Value</a><br></td>
        </tr>

        <tr>
           <td><strong>3. Key</strong></td>
           <td>Value</td>
        </tr>

        <tr>
           <td><strong>4. Key</strong></td>
           <td>
           <a >Val 1</a>
              Val 2

              <script>
                    $(document).ready(function () {
                       $('.class').click(function (e) {
                          e.bla();
                          sel.bla('/bla/bla', {
                                bla: true
                             }
                          );
                       });
                    });
                 </script>
              </td>
        </tr>

        <tr>
              <td><strong>5. Key</strong></td>
              <td>
                 <i></i>
                 Value
              </td>
        </tr>

     </tbody>

     <tbody>
        <tr>
           <td colspan="2">
              <p class="">
                 Heading 2</p>
           </td>
        </tr>

        <tr>
           <td><strong>6. Key</strong></td>
           <td>Value</td>
        </tr>
     </tbody>
  </table>

Получить ключ очень просто:

keys = response.xpath('//div[@class="grabme"]/table/tbody/tr/td/strong/text()').extract()

К сожалению, я не могу получить все ключи в примере, так как ключ 6 находится в новом теле.Но, как хак, я мог бы получить его отдельно и сделать выбор позже.

Получить значения намного сложнее.Мой лучший снимок такой:

values = [remove_tags(w).strip() for w in response.xpath('//div[@class="grabme"]/table/tbody/tr/td[1]/text()').extract()]

К сожалению, это не работает из-за дополнительных тегов HTML.Если бы я мог получить все значения, то мог бы заключить их в диктовку:

dict = {first: second for first, second in zip(keys, values)}

Эта часть также может быть сложной, как показано в примере, что ключ 4 имеет 2 значения.было бы хорошо, чтобы поместить их в одно значение с разделителем, чтобы я мог позже обрабатывать соответственно.

Как получить значения в моем примере или даже лучше, есть ли более разумный способ получения словаря всехтребуемый ключ, пары значений?

Эта попытка не удалась из-за разницы в структуре:

cells = response.xpath('//div[@class="grabme"]/tbody/tr/td/text()').extract()
dict = {first: second for first, second in zip(cells[::2], cells[1::2])}

1 Ответ

0 голосов
/ 23 декабря 2018

Вы можете попробовать этот XPath для сопоставления ключей и значений:

//div[@class="grabme"]//td/strong/text() | //div[@class="grabme"]//td[strong]/following-sibling::td//text()[normalize-space() and (parent::td or parent::a or parent::span)]

или разделить его на

//div[@class="grabme"]//td/strong/text()  # keys
//div[@class="grabme"]//td[strong]/following-sibling::td//text()[normalize-space() and (parent::td or parent::a or parent::span)]  # values

Обновление

items = {}
for row in response.xpath('//div[@class="grabme"]//tr[td[strong]]'):
    items[row.xpath('./td/strong/text()').extract_first()] = [td.strip() for td in row.xpath('./td[strong]/following-sibling::td//text()[normalize-space() and (parent::td or parent::a or parent::span)]').extract()]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...