2017-07-19 55 views
0

,所以我試圖用XPath函數boolean()並提取與scrapy 但所有scrapy還真假響應u'0'使用功能類似於布爾(),並與scrapy和XPath數()

與否其返回布爾真或布爾:假 scrapy總是返回
[<Selector xpath="boolean(.//*[@id='olp']/a)" data=u'0'>]

基本上這是我的XPath

布爾型(.//*[@ ID =「OLP」]/A)

當我它使用firepath它返回真或假 如果存在元素它,如果它不返回返回true運行假 而是通過scrapy時做

print selector.xpath("boolean(.//*[@id='olp']/a)").extract() 

任何人都可以在這裏幫我,我怎麼能直接通過scrapy得到真或假的......我知道我可以,如果元素存在或不檢查做到這一點通過蟒蛇..但我的目標是瞭解scrapy是否可以處理和返回此類功能的值,如boolean()count()

PS:我不需要確切的答案,我的目標刮..我只需要知道如何或是否可以在做.. 感謝

回答

0

你可以得到XPath和使用Python評價它:

body = "<div class=something>hello!</div>" 
sel = Selector(text=body) 
elements = sel.xpath('//div[@class="something"]') 
print(bool(elements)) 
# True 
print(len(elements)) 
# 1 
0

請注意:基於lxml的Scrapy選擇器與lxml的行爲與布爾XPath表達式的結果或那些返回數字的行爲不同。

讓我們用這個樣本HTML文件來說明:

>>> html = '''<!DOCTYPE html> 
... <html> 
... <head> 
...  <title>This is a title</title> 
... </head> 
... <body> 
...  <p>Hello world!</p> 
... </body> 
... </html>''' 

如果使用LXML直接,你可以測試例如一些元素的存在,如文檔中<div><p>

>>> import lxml.html 
>>> doc = lxml.html.fromstring(html) 
>>> doc.xpath('boolean(//div)') 
False 
>>> doc.xpath('boolean(//p)') 
True 

lxml的.xpath()返回您所期望的:沒有<div>元素,但有<p>

如果您將其與Scrapy選擇器進行比較,則調用.xpath()將返回一個Selector列表。 (這是獨立使用布爾表達式或沒有的。)

>>> import scrapy 
>>> response = scrapy.Selector(text=html) 
>>> response.xpath('boolean(//p)') 
[<Selector xpath='boolean(//p)' data='1'>] 

你需要調用.extract().extract_first()(或新.get()快捷方式),以獲得「有用的」數據上下工夫。你從.extract()/.extract_first()/.get()得到的是字符串(S):

>>> response.xpath('boolean(//p)').extract() 
['1'] 
>>> response.xpath('boolean(//p)').extract_first() 
'1' 
>>> response.xpath('boolean(//p)').get() 
'1' 

你看到的XPath true一個'1'。而且你還可以得到一個'0' XPath的false

>>> response.xpath('boolean(//div)').get() 
'0' 

在Python,bool()在非空字符串將返回True,無論字符串:

>>> bool(response.xpath('boolean(//p)').get()) 
True 
>>> bool(response.xpath('boolean(//div)').get()) 
True 

一個解決辦法是使用int()轉換「中」:

>>> bool(int(response.xpath('boolean(//p)').get())) 
True 
>>> bool(int(response.xpath('boolean(//div)').get())) 
False 

對於XPath表達式返回的數字,像count(...),LXML收益浮動:

>>> doc.xpath('count(//div)') 
0.0 
>>> doc.xpath('count(//p)') 
1.0 

儘管Scrapy選擇與返回的浮點數的字符串表示:

>>> response.xpath('count(//div)').get() 
'0.0' 
>>> response.xpath('count(//p)').get() 
'1.0' 

所以,你想通過提取的字符串到float()之後對結果進行處理:

>>> float(response.xpath('count(//p)').get()) 
1.0 
>>> float(response.xpath('count(//div)').get()) 
0.0