2014-01-24 6 views
0

Я пытаюсь создать парсер, который очистит данные из таблицы, содержащие информацию о наркотиках, таких как имя, форму и цену лекарственного средства. Проблема в том, что некоторые значения отсутствуют там, поэтому, когда я соскабливаю, порядок данных нарушается. Пожалуйста, взгляните ниже, чтобы лучше понять проблему.Скребок пустых полей из таблицы

форма Таблица:

+---------+----------+-------+ 
| name | form | price | 
+---------+----------+-------+ 
| aspirin | 3 pills | 1 | 
| aspirin | 5 pills |  | 
| aspirin | 10 pills | 3 | 
+---------+----------+-------+ 

Каждое поле цены является HTML ссылку, так что HTML этой таблицы выглядит следующим образом:

<table> 
<tr> 
<td>name</td> 
<td>form</td> 
<td>price</td> 
</tr> 
<tr> 
<td>aspirin</td> 
<td>3 pills</td> 
<td><a href="http://x.html">1</a></td> 
</tr> 
<tr> 
<td>aspirin</td> 
<td>5 pills</td> 
<td></td> 
</tr> 
<tr> 
<td>aspirin</td> 
<td>10 pills</td> 
<td><a href="http://x.html">3</a></td> 
</tr> 
</table> 

Какой самый лучший способ для извлечения полей цена от этого table, ВКЛЮЧАЯ также пустое поле, чтобы получить возвращенный элемент в этой форме: ['1', '', '3'].

При использовании xpath "// table/tr/td [3]/a/text() пустые поля опущены, и я получаю это: ['1', '3'].

Я думал о сканировании данных с помощью этого xpath: // table/tr/td [3]/", а затем преобразовал его в конвейер. Тем не менее, я надеюсь, что есть некоторые проще решение этой проблемы, вызывают данные, которые я сползать с оригинального сайта является немного более осложнила и в результате я получаю это:

[u'<td>\r\n\t\t\t\t</td>', 
u'<td>\r\n\t\t  \r\n  \t\t\t\t\t<a class="tooltip-lek" href="#" rel="#tooltip169815" title="Odp\u0142atno\u015b\u0107 po refundacji">3.20</a>\xa0\xa0\xa0\r\n\t\t\t<div style="display:none;" id="tooltip169815">\r\n\t\t\t\t<table>\r\n\t\t\t\t<tbody>\r\n\t\t\t\t\r\n\t\t\t\t<tr>\r\n\t\t\t\t<td style="padding-right:5px;">lek wydawany za odp\u0142atno\u015bci\u0105 rycza\u0142tow\u0105 (3,20 z\u0142) do wysoko\u015bci limitu:</td>\r\n\t\t\t\t<td>we wskazaniach:     choroba afektywna dwubiegunowa, schizofrenia</td>\r\n\t\t\t\t</tr>\r\n\t\t\t\t\r\n\t\t\t\t</tbody>\r\n\t\t\t\t</table>\r\n\t\t\t</div>\r\n\t\t\t\t\t\t\t</td>', 
u'<td>\r\n\t\t\t\t</td>'] 

ответ

1

Вы могли бы сделать что-то вроде

[u''.join(third_cell.xpath('./a/text()|./text()').extract()).strip() 
for third_cell in selector.xpath('//table/tr[position()>1]/td[3]')] 

т. Е. Зацикливание на каждой 3-й ячейке из каждой строки таблицы (начиная с строки 2) и объединение всех текстовых элементов в одну строку.

Вы должны получить [u'1', u'', u'3']

+0

Благодарим вас за ответ. Предоставленный soltuion работает, но только частично. В результате на реальном примере я получаю это: [u '\ r \ n \ t \ t \ t \ t', u '\ r \ n \ t \ t \ r \ n \ t \ t \ t \ т \ t3.20 \ xa0 \ xa0 \ xa0 \ г \ п \ т \ т \ т \ г \ п \ т \ т \ т \ т \ г \ п \ т \ т \ т \ т \ г \ п \ t \ t \ t \ t \ r \ n \ t \ t \ t \ t \ r \ n \ t \ t \ t \ tlek wydawany za odp \ u0142atno \ u015bci \ u0105 rycza \ u0142tow \ u0105 (3,20 z \ u0142) do wysoko \ u015bci limitu: \ r \ n \ t \ t \ t \ twe wskazanych: choroba afektywna dwubiegunowa, schizofrenia \ r \ n \ t \ t \ t \ t \ r \ n \ t \ t \ t \ т \ г \ п \ т \ т \ т \ т \ г \ п \ т \ т \ т \ т \ г \ п \ т \ т \ т \ г \ п \ т \ т \ т \ т \ т \ t \ t ', u' \ r \ n \ t \ t \ t \ t '], которому по-прежнему требуется много форматирования. –

+0

Возможно, исходный код webstie будет полезен: [link] (http://bazalekow.mp.pl/leki/item.html?id=22369&item_id=81272) –

+1

Используя вашу примерную страницу, я предлагаю вам попробовать '[u '.join (cell.xpath (' ./ a/text() | ./text() '). extract()). strip() для ячейки в sel.xpath (' // table // tr/td [5] ')] ' –

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