2017-07-19 50 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