【爬虫解析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

 

例子:


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

 

 

 

 

你可能感兴趣的:(XML,Python)