所以我试图使用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:我不需要准确回答我的刮擦目标..我只需要知道如何做或者是否可以做到...... 感谢
答案 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()