Я пытаюсь извлечь пары ключ / значение {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])}