2015-04-28 130 views
0

這是我需要通過scrapy使用XPath抓取部分:如何將值分配給Xpath中的空節點?

<tr class="o"><td>Alabama</td><td><code>US.AL</code></td><td><code>US01</code></td><td>Ala.</td><td>-6~</td><td class="n">4,779,736</td><td class="n">133,916</td><td class="n">51,705</td><td>2</td><td>Montgomery</td><td>Alabamian</td><td>350-369</td></tr> 
<tr class="e"><td>Alaska</td><td><code>US.AK</code></td><td><code>US02</code></td><td></td><td>-9~</td><td class="n">710,231</td><td class="n">1,530,700</td><td class="n">591,007</td><td>6</td><td>Juneau</td><td>Alaskan</td><td>995-999</td></tr> 

我的XPath表達式是:

response.xpath('//tr[@class="o" or @class="e"][2]/descendant::*').extract() 

但是有一個空節點在「阿拉斯加」。那就是在<code>「US02」之後的<td>節點。這在阿拉巴馬州不會發生。

當我使用表達式:

response.xpath('//tr[@class="o" or @class="e"][2]/descendant::*/text()').extract() 

提取文本,這個空節點將被忽略。我不得不遵守格式。那麼如何將這個空節點設置爲空間?

順便說一句,任何人都可以有更好的解決方案來抓取scrapy中的這個頁面嗎?

http://www.statoids.com/uus.html

+0

​​阿拉巴馬​​US.AL​​US01​​丙氨酸。​​-6〜 4779736 133916 51705​​2​​蒙哥馬利​​Alabamian​​350-369 ​​阿拉斯加​​US.AK​​US02​​​​-9 〜 710231 1530700 591007​​6​​朱諾​​阿拉斯加​​995-999 –

回答

0

我會在這裏顯式地,並在「柱」的方式獲得數據:

for state in response.xpath('//tr[@class="o" or @class="e"]'): 
    item = State() 
    item["hasc"] = state.xpath(".//td[2]/code/text()").extract() 
    ... 
    yield item 

其中State是你Item類。請注意,extract()會返回給您一個list。使用item loaderTakeFirstJoin處理器可以幫助您在項目字段中包含字符串值。

0

您可以選擇空元素這是不具有文本或子元素

\*[not(text()) and not(*)] 

因此,這將選擇空元素的XPATH將是

//tr[@class='o' or @class='e'][2]/descendant::*[not(text()) and not(*)] 

如果我們想得到例如一個字符串值爲「空」我們可以追加concat方法

//tr[@class='o' or @class='e'][2]/descendant::*[not(text()) and not(*)]/concat(.,'Empty') 

所以最後你可以|與獲得非空細胞

response.xpath('//tr[@class="o" or @class="e"][2]/descendant::*/text() | //tr[@class="o" or @class="e"][2]/descendant::*[not(text()) and not(*)]/concat(.,"Empty")).extract() 

我希望這可以幫助。

相關問題