zoukankan      html  css  js  c++  java
  • 爬虫解析: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

  • 相关阅读:
    Linux mail 命令使用
    django+nginx+xshell简易日志查询,接上<关于《rsyslog+mysql+loganalyzer搭建日志服务器<个人笔记>》的反思>
    django admin后台提示没有static样式相关的文件
    nginx+uwsgi<django web环境的搭建>
    CentOS 6.5升级Python和安装IPython
    关于《rsyslog+mysql+loganalyzer搭建日志服务器<个人笔记>》的反思
    记一次创建LVM的日志记录
    django TEMPLATES
    Only the sqlmigrate and sqlflush commands can be used when an app has migrations.
    rsyslog+mysql+loganalyzer搭建日志服务器<个人笔记>
  • 原文地址:https://www.cnblogs.com/sthu/p/7675427.html
Copyright © 2011-2022 走看看