2015-10-29 49 views
1

我正在刮一些韓文語言文本,並且因爲缺少一個更好的單詞而遇到很多「鏈接感嘆詞」,其中html看起來像這樣...scrapy/xpaths/regex:正確的xpath/re忽略「鏈接感嘆號」

<a href="path" title="저">는</a> 좋아요 

它顯示 '저' 作爲一個超鏈接,但 '는좋아요' 作爲普通的文本。他們是同一個字對象的現實的一部分,並顯示在頁面上'저는좋아요요不過在使用這個XPath和正則表達式...

foo = response.xpath('//*[@id="divID"]/p//text()').re(ur'[\uac00-\ud7af]+') 

將其拆分爲列表中的兩個詞刮時.. 。

foo == ['저', '는', '좋아요'] 

我怎麼能得到這個保持一個字,就像我原來的意圖?

intended: foo == ['좋는', '좋아요'] 

編輯:(評論響應)

用。加入的問題()是將加入所有的定期刮的話,以及據我可以告訴。所以,我最終會與此...

''.join(foo) == ['좋는좋아요'] 

所以我不認爲。加入()會工作,除非有我丟失的東西

+0

是' ''。加入(富)'有幫助嗎? – eLRuLL

+0

請參閱編輯請 – deltaskelta

+0

將其分解爲兩部分提取:提取鏈接後的文本('좋아요')並提取鏈接文本本身。如果您單獨執行此操作,則可以將'​​저'和'는'連接在一起。 – GHajba

回答

2

如果你想上的字符串表示工作一個HTML元素,XPath有一個string() function,可以是非常有用的。

一旦你有一個元素的單個字符串,你可以應用正則表達式的單詞。

下面是一個示例Python解釋器會話(我不得不改變你的標記位,以匹配顯示的結果):

>>> import scrapy 
>>> 
>>> response = scrapy.Selector(text=u'<p><a href="path" title="저">저</a>는 좋아요</p>') 

.//text()將選擇所有後代文本節點,作爲單獨的字符串時.extract() ED(2在這種情況下字符串):

>>> response.xpath('.//p//text()').extract() 
[u'\uc800', u'\ub294 \uc88b\uc544\uc694'] 

並與正則表達式,你會發現1個字,然後2個字:

>>> response.xpath('.//p//text()').re(ur'[\uac00-\ud7af]+') 
[u'\uc800', u'\ub294', u'\uc88b\uc544\uc694'] 
>>> for e in response.xpath('.//p//text()').re(ur'[\uac00-\ud7af]+'): 
...  print e 
... 
저 
는 
좋아요 

如果段落元素上使用XPath string()功能,你會得到一個字符串,即使該元素具有其他孩子一樣a

>>> response.xpath('string(.//p)').extract() 
[u'\uc800\ub294 \uc88b\uc544\uc694'] 
>>> print response.xpath('string(.//p)').extract_first() 
저는 좋아요 

然後你就可以申請你的正則表達式來分割上話:

>>> response.xpath('string(.//p)').re(ur'[\uac00-\ud7af]+') 
[u'\uc800\ub294', u'\uc88b\uc544\uc694'] 
>>> for e in response.xpath('string(.//p)').re(ur'[\uac00-\ud7af]+'): 
...  print e 
... 
저는 
좋아요 

注意string(node-set)只考慮在第一個元素的節點集合傳遞作爲參數,所以一定要確保你的XPath表達式第一個你想要的元素相匹配,或者與涉農供應鏈,你也可以鏈XPath表達式PY選擇:

>>> for e in response.xpath('.//p').xpath('string(.)').re(ur'[\uac00-\ud7af]+'): 
...  print e 
... 
저는 
좋아요 
+0

這工作完美,謝謝 – deltaskelta