2016-03-22 35 views
0

我已經使用scrapy從網頁獲取數據。我遇到了如下問題。如何獲得與Scrapy的完整鏈接文本

<li> 
<a href="NEW-IMAGE?type=GENE&amp;object=EG10567"> 
<b> 
man 
</b> 
X - 
<i> 
Escherichia coli 
</i> 
</a> 
<br> 
</li> 

在網頁中,該記錄的名稱看起來是這樣的: enter image description here

我想要得到的內容(例如:人X-大腸桿菌)在<a>標記,不想獲取其他標籤。這裏是我的代碼:

def parse(self, response): 
    sel = Selector(response) 
    sites = sel.xpath('//ul/li/a[contains(@href,"NEW-IMAGE")]') 
    base_url = "http://www.metacyc.org/META" 
for site in sites: 
    item = MetaCyc() 
    name_tmp = map(unicode.strip, site.xpath('text()').extract()) 
    item['Name'] = unicode(name_tmp).encode('utf-8') 
    item['Link'] = map(unicode.strip, site.xpath('@href').extract()) 
    yield item 

我試圖給的unicode轉換爲UTF-8,但結果仍然是這樣的:

{"Link": ["NEW-IMAGE?type=GENE&object=EG10567"], "Name": "[u'X -']"} 

有時也會有一些字符在記錄中缺失。 所以我想知道如何從HTML代碼中獲得完整和正確的格式數據。

+0

的Unicode轉換爲UTF-8並沒有太大的意義; UTF-8 *是* Unicode。你的結果與HTML不匹配,你能展示結果所指的真實HTML嗎? – JJJ

+0

對不起,這個是正確的** {「Link」:[「NEW-IMAGE?type = GENE&object = EG10567」],「Name」:「[u'X - ']」},**,你可以看到它的名稱不完整 –

+0

我會爲你編輯問題;儘量確保所有數據都是相關的。 Unicode與此無關。 – JJJ

回答

1

我建議你使用XPath's normalize-space()

正規化空間函數返回的參數字符串,這些空白由一個單一的空間剝離的空白字符開頭和結尾的空白並替代序列標準化。空白字符與XML中S生產所允許的字符相同。如果省略參數,則默認將上下文節點轉換爲字符串,換句話說就是上下文節點的字符串值。

>>> html = """<li> 
... <a href="NEW-IMAGE?type=GENE&amp;object=EG10567"> 
... <b> 
... man 
... </b> 
... X - 
... <i> 
... Escherichia coli 
... </i> 
... </a> 
... <br> 
... </li>""" 
>>> import scrapy 
>>> selector = scrapy.Selector(text=html) 

>>> 
>>> links = selector.xpath('//li/a[contains(@href,"NEW-IMAGE")]') 
>>> for link in links: 
...  item = {} 
...  item['Name'] = link.xpath('normalize-space(.)').extract_first() 
...  item['Link'] = link.xpath('@href').extract_first() 
...  print(item) 
... 
{'Link': u'NEW-IMAGE?type=GENE&object=EG10567', 'Name': u'man X - Escherichia coli'} 
>>> 
+0

我試過這種方法,我得到了幾乎有序的數據,但是有一個問題,有些字符似乎無法正確獲取,例如:網頁中的數據是'β-1,4 -D甘露糖基 - N-乙酰基d-GL ucosamine degradation「,我得到的數據是」{「Link」:[「NEW-IMAGE?type = PATHWAY&object = PWY-7586」],「Name」:「\ u03b2-1,4-D-甘露糖基-N-乙酰-D-葡糖胺降解「},'。正如你所看到的,字符**β**不正確。那麼如何解決這個問題呢? –

+0

'u'\ u03b2''並不正確,它就是Python2代表'β'的方式。在你的python解釋器中試試它:'>>>u'β''你會得到'u'\ u03b2''。如何導出這些Unicode數據會很重要,無論是JSON還是XML等,轉換都會發生,因爲鏈中的下一個工具需要解釋。建議儘可能使用Python中的Unicode字符串。只有在導出時,您才需要對其他工具的數據進行編碼。 –

+0

所以沒有辦法在Python中打印β,只有當我繼續處理數據時,我應該考慮這個問題? –

0

如果你想獲得a標籤的文字和其子的,你需要使用//text()代替text()

試試這個:

name_tmp = map(unicode.strip, site.xpath('//text()').extract()) 

您可以使用另一個模塊html2text獲得的純文本特定的標籤。

import html2text 
htmlconverter = html2text.HTML2Text() 
print htmlconverter.handle(''.join(name_tmp)) 
+0

對不起,我試過這種方法,但結果變得更加混亂。 –

+0

你可以給出輸出嗎? – Rahul

+0

我只想得到標籤中的內容,如果我使用你的方法,我會得到這麼多不相關的數據 –

0

我想要得到的內容(例如:人X-大腸桿菌)在<a>標籤,不想讓其他的標籤。

問題的一部分是文本並非全部包含在<a>標記中。其中一些嵌套在<i>標籤下面<a>標籤中。要獲得完整的鏈接文本字符串:

item_name = " ".join([word.strip() for word in sel.xpath('//li/a[contains(@href,"NEW-IMAGE")]//text()').extract() if len(word.strip())]) 
# => item_name = 'man X - Escherichia coli' 

//a//text()手段遞歸搶下的所有<a>標籤及其在文檔中的孩子的所有文字。你sel.xpath('//ul/li/a[contains(@href,"NEW-IMAGE")]/text()').extract()將得到「一些文本」

<a href="../">Some text</a> 

但會忽略「多一些這裏的」 <b>標籤內:

<a href="../">Some text<b>And some more here</b></a>