【爬虫解析1】:XPath总结

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

 

例子:

<bookstore>
	<book category="COOKING">
	  <title lang="en">Everyday Italian</title>
	  <author>Giada De Laurentiis</author>
	  <year>2005</year>
	  <price>30.00</price>
	</book>
</bookstore>

 

方法1:

path="/bookstore/book/title"
var nodes=xml.selectNodes(path);

for (i=0;i<nodes.length;i++)
  {
  document.write(nodes[i].childNodes[1].nodeValue + "<br>");
  }
}

 

方法2:

path="/bookstore/book/title/text()"
var nodes=xml.selectNodes(path);

for (i=0;i<nodes.length;i++)
  {
  document.write(nodes[i].nodeValue + "<br>");
  }
}

  

结果都为Everyday Italian

 

 ========================================================================

 Scrapy中使用XPath:

<html>
 <head>
  <base href='http://example.com/' />
  <title>Example website</title>
 </head>
 <body>
  <div id='images'>
   <a href='image1.html'>Name: My image 1 <br /><img src='image1_thumb.jpg' /></a>
   <a href='image2.html'>Name: My image 2 <br /><img src='image2_thumb.jpg' /></a>
   <a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a>
   <a href='image4.html'>Name: My image 4 <br /><img src='image4_thumb.jpg' /></a>
   <a href='image5.html'>Name: My image 5 <br /><img src='image5_thumb.jpg' /></a>
  </div>
 </body>
</html>

 

构造选择器(selectors)

Scrapy selector是以 文字(text) 或 TextResponse 构造的 Selector 实例。 其根据输入的类型自动选择最优的分析方法(XML vs HTML):

>>> from scrapy.selector import Selector

>>> from scrapy.http import HtmlResponse

以文字构造:

>>> body = '<html><body><span>good</span></body></html>'

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

[<Selector (text) xpath=//title/text()>]

>>> response.css('title::text')

[<Selector (text) xpath=//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'<a href="image1.html">Name: My image 1 <br><img src="image1_thumb.jpg"></a>',

 u'<a href="image2.html">Name: My image 2 <br><img src="image2_thumb.jpg"></a>',

 u'<a href="image3.html">Name: My image 3 <br><img src="image3_thumb.jpg"></a>',

 u'<a href="image4.html">Name: My image 4 <br><img src="image4_thumb.jpg"></a>',

 u'<a href="image5.html">Name: My image 5 <br><img src="image5_thumb.jpg"></a>']

 

使用相对XPaths

记住如果你使用嵌套的选择器,并使用起始为 / 的XPath,那么该XPath将对文档使用绝对路径,而且对于你调用的 Selector 不是相对路径。

比如,假设你想提取在 <div> 元素中的所有 <p> 元素。首先,你将先得到所有的 <div> 元素:

>>> divs = response.xpath('//div')

开始时,你可能会尝试使用下面的错误的方法,因为它其实是从整篇文档中,而不仅仅是从那些 <div> 元素内部提取所有的 <p> 元素:

>>> for p in divs.xpath('//p'):  # this is wrong - gets all <p> from the whole document

...     print p.extract()

下面是比较合适的处理方法(注意 .//p XPath的点前缀):

>>> for p in divs.xpath('.//p'):  # extracts all <p> inside

...     print p.extract()

另一种常见的情况将是提取所有直系 <p> 的结果:

>>> for p in divs.xpath('p'):

...     print p.extract()

 

 

 

 

猜你喜欢

转载自uule.iteye.com/blog/2367399