使用带有scrapy和xpath的Boolean()和count()等函数

时间:2017-07-19 07:22:58

标签: python xml xpath scrapy

所以我试图使用xpath函数[<Selector xpath="boolean(.//*[@id='olp']/a)" data=u'0'>]并使用scrapy提取真正的错误响应 但所有scrapy返回都是firepath

是否返回布尔值为true或布尔值:false scrapy总是返回
 print selector.xpath("boolean(.//*[@id='olp']/a)").extract()

基本上这是我的xpath

  

布尔型(.//*[@ ID = 'OLP'] / a)的

当我使用boolean()运行它时,它返回true或false 如果元素存在,则返回true,否则返回false 但是当通过scrapy做时

count()

任何人都可以在这里帮助我如何直接通过scrapy得到真或假...我知道我可以通过检查元素是否存在来通过python来做...但我的目标是知道scrapy是否可以处理和返回此类函数的值,例如public class Gizmo : TextBlock { public Gizmo() { this.AllowDrop = true; this.Background = Brushes.Gray; this.Margin = new System.Windows.Thickness(6); } public Gizmo(string content) : this() { this.Text = content; } private bool isDragging; private Point lastPressedLocation; protected override void OnPreviewMouseMove(System.Windows.Input.MouseEventArgs e) { if (e.LeftButton == System.Windows.Input.MouseButtonState.Pressed) { if (!this.isDragging) { Point newLocation = e.GetPosition(this); Vector offset = this.lastPressedLocation - newLocation; if (offset.LengthSquared > 36) { this.lastPressedLocation = newLocation; this.isDragging = true; System.Windows.DragDrop.DoDragDrop(this, DateTime.Now, DragDropEffects.Move); } else { this.isDragging = false; } } } } private bool canDrop; protected override void OnPreviewDragEnter(DragEventArgs e) { Console.WriteLine("drag enter inside"); if (this.Text == "gizmo 1") { e.Effects = DragDropEffects.Move; this.canDrop = true; } else { e.Effects = DragDropEffects.None; this.canDrop = false; } e.Handled = true; base.OnPreviewDragEnter(e); } protected override void OnPreviewDragOver(DragEventArgs e) { Console.WriteLine("drag over inside"); if (this.canDrop) { e.Effects = DragDropEffects.Move; } else { e.Effects = DragDropEffects.None; e.Handled = true; } base.OnPreviewDragOver(e); } } public class Container : WrapPanel { protected override void OnInitialized(EventArgs e) { for (int i = 1; i <= 16; i++) this.Children.Add(new Gizmo(string.Format("gizmo {0}", i))); base.OnInitialized(e); } protected override void OnPreviewDragEnter(System.Windows.DragEventArgs e) { Console.WriteLine("drag enter outside"); base.OnPreviewDragEnter(e); } protected override void OnPreviewDragOver(System.Windows.DragEventArgs e) { //I want to get mouse postion here, but this will be called only when dragging over gizmo inside Console.WriteLine("drag over outside"); base.OnPreviewDragOver(e); } }

ps:我不需要准确回答我的刮擦目标..我只需要知道如何做或者是否可以做到...... 感谢

2 个答案:

答案 0 :(得分:0)

您可以使用python获取xpath并对其进行评估:

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

答案 1 :(得分:0)

小心:Scrapy选择器虽然基于lxml,但与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()获得的是字符串:

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

您看到XPath '1' true。您还可以获得XPath '0'的{​​{1}}:

false

在Python中,非空字符串上的>>> response.xpath('boolean(//div)').get() '0' 将返回bool(),无论字符串是什么:

True

一种解决方法是使用“中间”中的>>> bool(response.xpath('boolean(//p)').get()) True >>> bool(response.xpath('boolean(//div)').get()) True 进行转换:

int()

对于返回数字的XPath表达式,如>>> bool(int(response.xpath('boolean(//p)').get())) True >>> bool(int(response.xpath('boolean(//div)').get())) False ,lxml返回浮点数:

count(...)

当Scrapy选择器返回浮点数的字符串表示形式时:

>>> 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()