如果存在其他标记,如何将键值对提取到dict中?

2024-10-03 11:20:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用python从HTML表中提取键/值{1,2}对,并将它们拉入字典。你知道吗

表元素看起来并不总是一样的,这就是我的问题所在。你知道吗

一个简单的例子:

  <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位于新的tbody中。但是作为一个黑客,我可以单独得到它,然后再口述。你知道吗

获取这些值要困难得多。我的最佳选择是:

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

由于额外的html标记,这种不幸的方法不起作用。 如果我能够获取所有值,那么我可以将它们拉入一个dict:

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])}

Tags: keydivvalueresponsetablescripttrclass
1条回答
网友
1楼 · 发布于 2024-10-03 11:20:07

您可以尝试使用此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()]

相关问题 更多 >