美文网首页
XPath常见使用

XPath常见使用

作者: 嫌疑人zx | 来源:发表于2019-02-13 10:55 被阅读4次

    XPath表达式


    面对较大的文档,你可能需要写很长的XParh表达式,为了避免这一点,两个斜杠线//可以访问到所有的同名元素。列如,//p可以选择所有的p元素,//a可以选择所有的链接。

    eg:

     <a href="http://www.iana.org/domains/example">More information...</a> 
    

    只选择链接:

     $x('//a/@href')
    
     [href="http://www.iana.org/domains/example"]
    

    只选择文字:

     $x('//a/text()')
    
     ["More information..."]
    

    常见工作


    • 获取id为firstHeading的div下的span的文字
     $x(//h1[@id="firstHeading"]/span/text())
    
    • 获得id为toc的div下的URL
     $x(//div[@id="toc"]/ul//a/@href)
    
    • 在任意class包含skin-vector的元素之内,获取h1的text,这两个字符串可能在同一个class内,或不在。
     $x(//*[contains(@class,"ltr") and contains(@class,"skin-vector")]//h1//text())
    
    • 选择class属性是infoclass的table的第一张图片的URL
     $x(//table[@class="infobox"]//img[1]/@src)
    
    • 选择class属性是reflist开头的div下面的所有URL链接
     $x(//div[starts-with(@class,"reflist")]//a/@href)
    
    • 选择div下面的所有URL链接,并且这个div的下一个相邻元素的子元素包含文字References
     $x(//*[text()="References"]/../following-sibling::div//a)
    
    • 获取所有图片的URL
     $x(//img/@src)
    

    提前应对网页发生的改变


    爬取的目标网页位于远程服务器,这意味着,他的HTML会发生改变。XPath表达式就会失效。一些基本原则,可以帮助我们降低表达式失效的概率:

    • 避免使用数组序号!比如:
    $x(//*[@id="myid"]/div/div/div[1]/div[2]/div/div[1]/div[1]/a/img)
    

    解决方法:尽量找到离目标标签近的元素,根据元素的id或者class属性,进行抓取。id通常是最靠谱的!

    相关文章

      网友评论

          本文标题:XPath常见使用

          本文链接:https://www.haomeiwen.com/subject/dtsreqtx.html