作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 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>
获取 key 很容易:
keys = response.xpath('//div[@class="grabme"]/table/tbody/tr/td/strong/text()').extract()
不幸的是,我无法获取示例中的所有 key ,因为 key 6 在新的 tbody 中。但作为一个黑客,我可以单独获取它并稍后附加到听写。
获取值要困难得多。我最好的镜头是这样的:
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])}
最佳答案
您可以尝试使用此 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()]
关于python - 如果存在其他标签,如何将键值对提取到字典中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53902502/
我是一名优秀的程序员,十分优秀!