2012-01-26 25 views
2

免責聲明:新增scrapy。scrapy帶有換行符和嵌套標籤

我有一個表相當不規則的行,其基本結構是:

<tr> 
<td> some text </td> 
<td> some other text </td> 
<td> yet some text </td> 
</tr> 

但偶爾(幾百倍)的某些行是

<tr> 
<td> <p> some text <p> </td> 
<td> <div class="class-whateva"> <p> some other text </p></div> </td> 
<td> <span id="strange-id"> 
    <a href="somelink"> yet some text </a> 
    <span> </td> 
</tr> 

或1或2的其他的排列嵌套「p」「div」和「span」有或沒有返回行字符。

我已經採取了嵌套的「跨跨度」或​​「P格」或「分區跨越」與形式的條件語句的護理:

for row in allrows: 
     if row.select('td[2]/text()'): 
      item['seconditem']=row.select('td[2]/text()').extract() 
     elif row.select('td[2]/*/text()'): 
      item['seconditem']=row.select('td[2]/*/text()').extract() 
     elif row.select('td[2]/*/*/text()'): 
      item['seconditem']=row.select('td[2]/*/*/text()').extract() 

現在我有兩個問題:

(1)是否有條件

td[2]/*/*/text() 

正確的方式去尋找不規則的嵌套行? (2)我仍然缺少標籤前有返回(或換行符)的所有情況。 因此,如果該行的形式爲:

<td><div> 
     <p>text </p> 
    </div></td> 

我所有的XPath會返回一個[ '\ n']。捕捉換行符後的任何竅門?

任何提示讚賞。謝謝。

回答

3

可以使用string()功能XPath表達來獲得所有內部文本節點在一個字符串:

# nested.html - your second html snippet 
# $scrapy shell "nested.html" 

In [1]: row = hxs.select('//tr') 

In [2]: row.select('td[2]').select('string()').extract() 
Out[2]: [u' some other text '] 

In [3]: row.select('td[2]').select('string()').extract()[0] 
Out[3]: u' some other text ' 

In [4]: row.select('td[3]').select('string()').extract()[0] 
Out[4]: u' \r\n yet some text \r\n  ' 

或者//text()讓所有內部text節點:

In [5]: row.select('td[3]//text()').extract() 
Out[5]: [u' \r\n ', u' yet some text ', u' \r\n ', u' '] 

而且''.join(...)到獲取字符串:

In [6]: ''.join(row.select('td[3]//text()').extract()) 
Out[6]: u' \r\n yet some text \r\n  ' 
+0

感謝reclosedev。我不知道select('string()')。它的作用像魅力。 – Massagran

+0

@reclosedev你可以幫助解決這個問題http://stackoverflow.com/questions/37915573/how-to-extract-li-element-using-xpath-and-put-each-and-every-one-in-a -分離 – nand