专栏首页Python与爬虫爬虫入门到精通-网页的解析(xpath)

爬虫入门到精通-网页的解析(xpath)

本文章属于爬虫入门到精通系统教程第六讲

在爬虫入门到精通第五讲中,我们了解了如何用正则表达式去抓取我们想要的内容.这一章我们来学习如何更加简单的来获取我们想要的内容.

xpath的解释

XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。 XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初XPath的提出的初衷是将其作为一个通用的、介于XPointer与XSL间的语法模型。但是XPath很快的被开发者采用来当作小型查询语言。

XPath的基本使用

要使用xpath我们需要下载lxml,在爬虫入门到精通-环境的搭建(http://mp.weixin.qq.com/s?__biz=MzU2OTAxNTcwMw==&mid=100000022&idx=1&sn=a7091cd4b98790b6a4ed017921e757fb&chksm=7c846dee4bf3e4f83758b7c9a9bd75822b006770b71c7c29722f2c28840edfbc705951960d7f#rd)这一章也说明怎么装,如果还没有安装的话,那就去下载安装吧

直接看代码实战吧。

from lxml import etree
# 定义一个函数,给他一个html,返回xml结构
def getxpath(html):
    return etree.HTML(html)
# 下面是我们实战的第一个html
sample1 = """
<html> 
   <head> <title>My page</title></head> 
   <body> 
     <h2>Welcome to my <a href="#" src="x">page</a></h2>    
     <p>This is the first paragraph.</p>   
     <!-- this is the end -->  
   </body>
</html>"""
# 获取xml结构
s1 = getxpath(sample1)
# 获取标题(两种方法都可以)#有同学在评论区指出我这边相对路径和绝对路径有问题,我搜索了下#发现定义如下图
s1.xpath('//title/text()')
s1.xpath('/html/head/title/text()')

相对路径与绝对路径

总结及注意事项

  • 获取文本内容用 text()
  • 获取注释用 comment()
  • 获取其它任何属性用@xx,如
    • @href
    • @src
    • @value
sample2 = """
<html>
  <body>
    <ul>
      <li>Quote 1</li>
      <li>Quote 2 with <a href="...">link</a></li>
      <li>Quote 3 with <a href="...">another link</a></li>
      <li><h2>Quote 4 title</h2> ...</li>
    </ul>
  </body>
</html>
"""
s2 = getxpath(sample2)

总结及注意事项

  • 上面的li 可以更换为任何标签,如 p、div
  • 位置默认以1开始的
  • 最后一个用 li[last()] 不能用 li[-1]
  • 这个一般在抓取网页的下一页,最后一页会用到
sample3 = """
<html>  
  <body>    
    <ul>      
      <li id="begin"><a href="https://scrapy.org">Scrapy</a>begin</li>      
      <li><a href="https://scrapinghub.com">Scrapinghub</a></li>      
      <li><a href="https://blog.scrapinghub.com">Scrapinghub Blog</a></li>      
      <li id="end"><a href="http://quotes.toscrape.com">Quotes To Scrape</a>end</li>      
      <li data-xxxx="end" abc="abc"><a href="http://quotes.toscrape.com">Quotes To Scrape</a>end</li>    
    </ul>  
  </body></html>"""
s3 = getxpath(sample3)

总结及注意事项

  • 根据html的属性或者文本直接定位到当前标签
  • 文本是 text()='xxx'
  • 其它属性是@xx='xxx'
  • 这个是我们用到最多的,如抓取知乎的xsrf(见下图)
    • 我们只要用如下代码就可以了 //input[@name="_xsrf"]/@value
sample4 = u"""
<html>  
  <head>    
    <title>My page</title>  
  </head>  
  <body>    
    <h2>Welcome to my <a href="#" src="x">page</a></h2>    
    <p>This is the first paragraph.</p>    
    <p class="test">编程语言
        <a href="#">python</a>
        <img src="#" alt="test"/>javascript   
       <a href="#"><strong>C#</strong>JAVA</a>
    </p>    
    <p class="content-a">a</p>    
    <p class="content-b">b</p>    
    <p class="content-c">c</p>    
    <p class="content-d">d</p>    
    <p class="econtent-e">e</p>    
    <p class="heh">f</p>    
    <!-- this is the end -->  
  </body>
</html>"""
s4 = etree.HTML(sample4)

总结及注意事项

  • 想要获取某个标签下所有的文本(包括子标签下的文本),使用string
    • 如 <p>123<a>来获取我啊</a></p>,这边如果想要得到的文本为"123来获取我啊",则需要使用string
  • starts-with 匹配字符串前面相等
  • contains 匹配任何位置相等
  • 当然其中的(@class,"content")也可以根据需要改成(text(),"content")或者其它属性(@src,"content")

最后再次总结一下

看完本篇文章后,你应该要

  • 能学会基本所有的xpath的使用
  • css和这个的原理一样,所以就不介绍了,可以参考
    • CSS 选择器参考手册(http://www.w3school.com.cn/cssref/css_selectors.asp)

本文分享自微信公众号 - Python爬虫分享(python_crawler),作者:爬虫

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-04-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • websocket与爬虫

    背景 写爬虫的目的应该就是为了拿到数据,或者说模拟某种操作 如果他使用的是http(s) 协议来传输数据的,那么我们就模拟http协议来发送数据 如果它使用的是...

    爬虫
  • 再也不用担心网页编码的坑了!

    大家爬取网页的时候,应该都遇到过这种情况 当我打印网页源代码的时候 发现 全部是乱码的 ? 那这个时候应该怎么办呢? requests是如何判断编码 首先,r...

    爬虫
  • 如何获取小程序的源代码

    准备工作 手机已经root adb.exe 已经放到了系统环境变量,也就是打开cmd 后输入 adb不会报错,如下图 ? 手机能连上电脑,并且手机开启us...

    爬虫
  • jquery导航栏点击及页面跳转后对应栏目添加选中效果

    但是一般页面的导航栏都是需要跳转页面的,上面的方法只在当前页面有效,跳转后就失效了。

    德顺
  • 制作滑动条菜单,如何延时处理滑动效果,避免动画卡顿

        前几日在利用JQuery做菜单滑动标记这个效果的时候,最后发现滑动条在我用鼠标快速滑动的时候,会出现滑动条延迟滑动,并且有卡顿的现象,相当影响体验感受。...

    八哥
  • 6.04-news_xpath3

    hankleo
  • 符合标准的有序列表分页源码示例

    一个符合标准的有序列表分页源码示例。 你可以根据你所应用的不同程序语言,打包生成一个符合标准的分页控件。 DOM结构: <ul class="paginatio...

    练小习
  • 获取元素

    例如:我们想要操作页面上的某部分(显示/隐藏,动画),需要先获取到该部分对应的元素,再对其进行操作。

    星辰_大海
  • 使用CSS制作文字环绕图片效果(文字内容包含<li>标签)

    1.一般制作文字环绕图片效果。 HTML结构: View Code <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1....

    八哥
  • 点击a页面链接跳转b页面某个tab切换的实现

    解释一下,首先有一行 .tab 是 tab按钮, .inner 是对应的三个 li 默认隐藏,第几个 tab 选中就对应的显示第几个 li 。 

    德顺

扫码关注云+社区

领取腾讯云代金券