Python 将Boolean()和count()等函数与scrapy和xpath一起使用

Python 将Boolean()和count()等函数与scrapy和xpath一起使用,python,xml,xpath,scrapy,Python,Xml,Xpath,Scrapy,所以我尝试使用xpath函数boolean并用scrapy提取真-假响应 但所有的回报都是u'0' 是否返回布尔值true或boolean:false 刮痧总是回来的 [] 基本上这是我的xpath 布尔值。//*[@id='olp']/a 当我使用firepath运行它时,它返回true或false 如果元素存在,则返回true;如果不存在,则返回false 但是当你通过刮痧的时候 print selector.xpath("boolean(.//*[@id='olp']/a)").extra

所以我尝试使用xpath函数boolean并用scrapy提取真-假响应 但所有的回报都是u'0'

是否返回布尔值true或boolean:false 刮痧总是回来的 []

基本上这是我的xpath

布尔值。//*[@id='olp']/a

当我使用firepath运行它时,它返回true或false 如果元素存在,则返回true;如果不存在,则返回false 但是当你通过刮痧的时候

print selector.xpath("boolean(.//*[@id='olp']/a)").extract()
这里有没有人能帮我通过scrapy直接判断真假。。。我知道我可以通过python通过检查元素是否存在来实现。。但我的目标是了解scrapy是否可以处理并返回布尔或计数等函数的值

附言:我不需要确切的答案,我的刮目标。。我只是想知道如何或者是否可以做到。。
谢谢

您可以获取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

注意:基于lxml的Scrapy选择器在布尔XPath表达式或返回数字的结果方面的行为与lxml不同

让我们使用此示例HTML文档来说明:

>>> html = '''<!DOCTYPE html>
... <html>
...   <head>
...     <title>This is a title</title>
...   </head>
...   <body>
...     <p>Hello world!</p>
...   </body>
... </html>'''
xpath返回您期望的结果:没有元素,但有一个

如果将其与Scrapy选择器进行比较,则调用.xpath将返回选择器列表。这与是否使用布尔表达式无关

>>> import scrapy
>>> response = scrapy.Selector(text=html)
>>> response.xpath('boolean(//p)')
[<Selector xpath='boolean(//p)' data='1'>]
您会看到XPath true的“1”。对于XPath false,也会得到一个“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
而带有返回浮点数的字符串表示形式的刮片选择器:

>>> 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
>>> doc.xpath('count(//div)')
0.0
>>> doc.xpath('count(//p)')
1.0
>>> response.xpath('count(//div)').get()
'0.0'
>>> response.xpath('count(//p)').get()
'1.0'
>>> float(response.xpath('count(//p)').get())
1.0
>>> float(response.xpath('count(//div)').get())
0.0