2014-01-24 35 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> 

什麼來提取這一價格領域的最佳方法包括空欄位,以此形式返回項目: ['1','','3']。當使用xpath「// table/tr/td [3]/a/text()」時,空字段被省略,我得到這個:['1','3']。

我在考慮使用這個xpath:「// table/tr/td [3] /」來抓取數據,然後在管道中對其進行轉換。不過,我希望有一些simplier解決這個,使我從原來的網站抓取數據更comlicated了一下,結果我得到這個:

[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 \ r \ n \噸\噸\噸\ r \ n \噸\噸\噸\噸\ r \ n \噸\噸\噸\噸\ r \ n \ 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 wskazaniach:choroba afektywna dwubiegunowa,schizofrenia \ r \ n \ t \ t \ t \ r \ n \ t \ t \ t \噸\ r \ n \噸\噸\噸\噸\ r \ n \噸\噸\噸\噸\ r \ n \噸\噸\噸\ r \ n \噸\噸\噸\噸\噸\ t \ t', u'\ r \ n \ t \ t \ t \ t']仍然需要很多格式化。 –

+0

也許webstie的源代碼將是有用的:[鏈接](http://bazalekow.mp.pl/leki/item.html?id=22369&item_id=81272) –

+1

使用您的示例頁面我建議你嘗試'[u ''.join(cell.xpath('./ a/text()| ./text()')。extract())。strip() for sel.xpath('// // // tr/td [5]')]' –