XPATH教程
1、加载 XML 文档
所有现代浏览器都支持使用 XMLHttpRequest 来加载 XML 文档的方法。
针对大多数现代浏览器的代码:
var xmlhttp=new XMLHttpRequest()
针对古老的微软浏览器(IE 5 和 6)的代码:
var xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")
2、选取节点
Internet Explorer 使用 selectNodes() 方法从 XML 文档中的选取节点:
xmlDoc.selectNodes(xpath);
Firefox、Chrome、Opera 以及 Safari 使用 evaluate() 方法从 XML 文档中选取节点:
xmlDoc.evaluate(xpath, xmlDoc, null, XPathResult.ANY_TYPE,null);
3、
选取所有 title
/bookstore/book/title
选取第一个 book 的 title
/bookstore/book[1]/title
这里有一个问题。上面的例子在 IE 和其他浏览器中输出不同的结果。
IE5 以及更高版本将 [0] 视为第一个节点,而根据 W3C 的标准,应该是 [1]。
为了解决 IE5+ 中 [0] 和 [1] 的问题,可以为 XPath 设置语言选择(SelectionLanguage)。
xml.setProperty("SelectionLanguage","XPath");
xml.selectNodes("/bookstore/book[1]/title");
选取所有价格
下面的例子选取 price 节点中的所有文本:
/bookstore/book/price/text()
选取价格高于 35 的 price 节点
下面的例子选取价格高于 35 的所有 price 节点:
/bookstore/book[price>35]/price
选取价格高于 35 的 title 节点
下面的例子选取价格高于 35 的所有 title 节点:
/bookstore/book[price>35]/title
例子:
Everyday Italian Giada De Laurentiis 2005 30.00
方法1:
path="/bookstore/book/title"
var nodes=xml.selectNodes(path);
for (i=0;i");
}
}
方法2:
path="/bookstore/book/title/text()"
var nodes=xml.selectNodes(path);
for (i=0;i");
}
}
结果都为Everyday Italian
========================================================================
Scrapy中使用XPath:
Example website
构造选择器(selectors)
Scrapy selector是以 文字(text) 或 TextResponse 构造的 Selector 实例。 其根据输入的类型自动选择最优的分析方法(XML vs HTML):
>>> from scrapy.selector import Selector
>>> from scrapy.http import HtmlResponse
以文字构造:
>>> body = 'good'
>>> Selector(text=body).xpath('//span/text()').extract()
[u'good']
以response构造:
>>> response = HtmlResponse(url='http://example.com', body=body)
>>> Selector(response=response).xpath('//span/text()').extract()
[u'good']
为了方便起见,response对象以 .selector 属性提供了一个selector, 您可以随时使用该快捷方法:
>>> response.selector.xpath('//span/text()').extract()
[u'good']
Scrapy提供了两个实用的快捷方式: response.xpath() 及 response.css():
>>> response.xpath('//title/text()')
[
>>> response.css('title::text')
[
>>> response.xpath('//base/@href').extract()
[u'http://example.com/']
>>> response.css('base::attr(href)').extract()
[u'http://example.com/']
>>> response.xpath('//a[contains(@href, "image")]/@href').extract()
[u'image1.html',
u'image2.html',
u'image3.html',
u'image4.html',
u'image5.html']
>>> response.css('a[href*=image]::attr(href)').extract()
[u'image1.html',
u'image2.html',
u'image3.html',
u'image4.html',
u'image5.html']
>>> response.xpath('//a[contains(@href, "image")]/img/@src').extract()
[u'image1_thumb.jpg',
u'image2_thumb.jpg',
u'image3_thumb.jpg',
u'image4_thumb.jpg',
u'image5_thumb.jpg']
>>> response.css('a[href*=image] img::attr(src)').extract()
[u'image1_thumb.jpg',
u'image2_thumb.jpg',
u'image3_thumb.jpg',
u'image4_thumb.jpg',
u'image5_thumb.jpg']
>>> links = response.xpath('//a[contains(@href, "image")]')
>>> links.extract()
[u'Name: My image 1
',
u'Name: My image 2
',
u'Name: My image 3
',
u'Name: My image 4
',
u'Name: My image 5
']
使用相对XPaths
记住如果你使用嵌套的选择器,并使用起始为 / 的XPath,那么该XPath将对文档使用绝对路径,而且对于你调用的 Selector 不是相对路径。
比如,假设你想提取在 元素。首先,你将先得到所有的 >>> divs = response.xpath('//div') 开始时,你可能会尝试使用下面的错误的方法,因为它其实是从整篇文档中,而不仅仅是从那些 元素: >>> for p in divs.xpath('//p'): # this is wrong - gets all from the whole document ... print p.extract() 下面是比较合适的处理方法(注意 .//p XPath的点前缀): >>> for p in divs.xpath('.//p'): # extracts all inside ... print p.extract() 另一种常见的情况将是提取所有直系 的结果: >>> for p in divs.xpath('p'): ... print p.extract()