2015-11-30 6 views
2

Я пытаюсь извлечь строки с их соответствующими клетками из следующей таблицы:Извлечение строк из таблицы

<table border="0" cellspacing="1" cellpading="3" width="100%"> 
<tr bgcolor="#505050"> 
    <td><b></b></td> 
    <td colspan="2" align="center" class="white"><b>Last Day</b></td> 
    <td colspan="2" align="center" class="white"><b>Last Week</b></td> 
</tr> 
<tr bgcolor="#505050"> 
    <td class="white"><b>Race</b></td> 
    <td align="center" class="white"><b>Killed Players</b></td> 
    <td align="center" class="white"><b>Killed by Players</b></td> 
    <td align="center" class="white"><b>Killed Players</b></td> 
    <td align="center" class="white"><b>Killed by Players</b></td> 
</tr> 
<tr bgcolor="#F1E0C6"> 
    <td>A</td> 
    <td align="right">0</td> 
    <td align="right">3</td> 
    <td align="right">0</td> 
    <td align="right">13</td> 
</tr> 
<tr bgcolor="#D4C0A1"> 
    <td>B</td> 
    <td align="right">0</td> 
    <td align="right">0</td> 
    <td align="right">0</td> 
    <td align="right">7</td> 
</tr> 
<tr bgcolor="#F1E0C6"> 
    <td>C</td> 
    <td align="right">0</td> 
    <td align="right">0</td> 
    <td align="right">0</td> 
    <td align="right">1</td> 
</tr> 
<tr bgcolor="#D4C0A1"> 
    <td>D</td> 
    <td align="right">0</td> 
    <td align="right">0</td> 
    <td align="right">0</td> 
    <td align="right">7</td> 
</tr> 
<tr bgcolor="#505050"> 
    <td class=white><b>Total</b></td> 
    <td align="right" class="white"><b>210</b></td> 
    <td align="right" class="white"><b>1060458</b></td> 
    <td align="right" class="white"><b>1132</b></td> 
    <td align="right" class="white"><b>5585115</b></td> 
</tr> 

Ряды Я заинтересован в те с A, B, C и т. Д. Рядом с ними номера.

Решение, которое я придумал это:

table = tree.xpath("//table/tr[td[not(contains(@class, 'white'))]]") 

for tr in table: 
    print(tr.xpath('td/text()')) 

Однако выход по-прежнему включает в себя первую строку с пустой клеткой и последний день/неделя из них, и выглядит следующим образом:

['', 'Last Day', 'Last Week'] 
['A', '0', '3', '0', '13'] 
['B', '0', '0', '2', '0'] 
['C', '0', '3', '0', '5'] 

Что можно сделать, чтобы избавиться от него?

+0

Вы можете оставить свой ожидаемый результат? – drkthng

+0

Конечно, обновил исходное сообщение. – adrift

ответ

1

Просто измените tr быть:

tr[not(contains(@bgcolor, "505050"))] 

Так что ваш код должен выглядеть следующим образом:

from lxml import html 

HTML = """<table border="0" cellspacing="1" cellpading="3" width="100%"> 
<tr bgcolor="#505050"> 
    <td><b></b></td> 
    <td colspan="2" align="center" class="white"><b>Last Day</b></td> 
    <td colspan="2" align="center" class="white"><b>Last Week</b></td> 
</tr> 
<tr bgcolor="#505050"> 
    <td class="white"><b>Race</b></td> 
    <td align="center" class="white"><b>Killed Players</b></td> 
    <td align="center" class="white"><b>Killed by Players</b></td> 
    <td align="center" class="white"><b>Killed Players</b></td> 
    <td align="center" class="white"><b>Killed by Players</b></td> 
</tr> 
<tr bgcolor="#F1E0C6"> 
    <td>A</td> 
    <td align="right">0</td> 
    <td align="right">3</td> 
    <td align="right">0</td> 
    <td align="right">13</td> 
</tr> 
<tr bgcolor="#D4C0A1"> 
    <td>B</td> 
    <td align="right">0</td> 
    <td align="right">0</td> 
    <td align="right">0</td> 
    <td align="right">7</td> 
</tr> 
<tr bgcolor="#F1E0C6"> 
    <td>C</td> 
    <td align="right">0</td> 
    <td align="right">0</td> 
    <td align="right">0</td> 
    <td align="right">1</td> 
</tr> 
<tr bgcolor="#D4C0A1"> 
    <td>D</td> 
    <td align="right">0</td> 
    <td align="right">0</td> 
    <td align="right">0</td> 
    <td align="right">7</td> 
</tr> 
<tr bgcolor="#505050"> 
    <td class=white><b>Total</b></td> 
    <td align="right" class="white"><b>210</b></td> 
    <td align="right" class="white"><b>1060458</b></td> 
    <td align="right" class="white"><b>1132</b></td> 
    <td align="right" class="white"><b>5585115</b></td> 
</tr>""" 

tree = html.fromstring(HTML) 
results = defaultdict 

for item in tree.xpath('//table/tr[not(contains(@bgcolor, "505050"))]'): 
    print item.xpath('.//td/text()') 

И выход:

['A', '0', '3', '0', '13'] 
['B', '0', '0', '0', '7'] 
['C', '0', '0', '0', '1'] 
['D', '0', '0', '0', '7'] 

Тем не менее, я бы рекомендовал использовать dict(). См:

tree = html.fromstring(HTML) 
results = dict() 

def unpack(data): 
    return data[0], data[1:] 

for item in tree.xpath('//table/tr[not(contains(@bgcolor, "505050"))]'): 
    key, values = unpack(item.xpath('.//td/text()')) 
    results[key] = values 

print results 

Выход:

{ 
    'A': ['0', '3', '0', '13'], 
    'C': ['0', '0', '0', '1'], 
    'B': ['0', '0', '0', '7'], 
    'D': ['0', '0', '0', '7'] 
} 

В Python 3, там не нужно иметь unpack() функцию, как показано выше, вам просто нужно будет изменить key, values = unpack(item.xpath('.//td/text()')) к key, *values = item.xpath('.//td/text()')

https://www.python.org/dev/peps/pep-3132/


Кроме того, если вы хотите, вы можете сортировать результаты по букве (ключ) с использованием sorted():

[ 
    ('A', ['0', '3', '0', '13']), 
    ('B', ['0', '0', '0', '7']), 
    ('C', ['0', '0', '0', '1']), 
    ('D', ['0', '0', '0', '7']) 
] 
+0

Ничего себе, спасибо! – adrift

+0

@adrift мое удовольствие. Пожалуйста, не забудьте принять мой ответ, если это поможет вам решить проблему :) –

Смежные вопросы