爬虫解析: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()

 

from:http://uule.iteye.com/blog/2367399

posted @ 2017-10-16 08:48  yonziliu  阅读(1208)  评论(0编辑  收藏  举报