Python爬虫的xpath基础使用小结

xpath和正则、bs4都属于解析网页源码的方法,一般来说应该bs4最简便、用的最多吧?
这部分可以当个web基础来看
综合百度、部分网上的文章和学到的内容,写个初版本,还有函数什么的老师没讲我也就没看。

关于xpath(太过概念了感觉基本可以跳过直接看代码来理解)

XPath=XML路径语言(XML Path Language),是一种用来确定XML文档中某部分位置的语言。
XML文档被作为节点树,以路径表达式的形式来指定元素。
被开发者用来当作小型查询语言。返回值可能是节点,节点集,字符串,逻辑值,数字以及混合等。
可以概括为4个方面:节点、语法、轴、运算符

  1. 节点

    7种类型:
    1 元素
    2 属性
    3 文本
    4 命名空间
    5 处理指令
    6 注释
    7 文档节点(根节点)
    节点关系:
    1 父Parent
    2 子Children
    3 同胞Sibling
    4 先辈Ancestor
    5 后代Descendant


  2. 轴可定义相对于当前节点的节点集。
    在这里插入图片描述
    每个步均根据当前节点集之中的节点来进行计算。
    (说明详见3.语法)
    实例
    在这里插入图片描述

  3. 语法
    XPath 使用路径表达式在 XML 文档中选取节点或节点集。节点是通过沿着路径path或者步 step 来选取的。

    路径表达式语法:
    路径 = 相对路径 | 绝对路径
    XPath路径表达式 = 步进表达式 | 相对路径 "/"步进表达式。
    步进表达式=轴名称::节点测试[谓语]

    说明:

    其中轴表示步进表达式选择的节点和当前上下文节点间的树状关系(层次关系),节点测试指定步进表达式选择的节点名称扩展名,谓词即相当于过滤表达式以进一步过滤细化节点集。
    谓词可以是0个或多个。多个多个谓词用逻辑操作符and, or连接。取逻辑非用not()函数。
    

    请看一个典型的XPath查询表达式:/messages/message//child::node()[@id=0],
    其中/messages/message是路径(绝对路径以"/"开始),
    child::是轴表示在子节点下选择,
    node()是节点测试表示选择所有的节点。
    [@id=0]是谓词,表示选择所有有属性id并且值为0的节点。

    下面列出了最有用的路径表达式:
    在这里插入图片描述
    路径表达式实例:
    在这里插入图片描述

  4. 运算符
    下面列出了可用在 XPath 表达式中的运算符:
    在这里插入图片描述

Python中使用方法及代码示例

在实际Python中使用的时候xpath是lxml的一个方法。
关于安装部分的坑见我之前写过的《记录一下pycharm想用xpath遇到的坑们》https://blog.csdn.net/xinyiatcsdn/article/details/93419463
接下来用代码来说明一下使用方法:
就2步骤:
1.转解析类型
2.调用xpath的方法

import requests
import lxml
from lxml import etree
url='http://news.baidu.com'
headers={
    ""
}
data=requests.get(url,headers=headers).content.decode()

#1.转解析类型
xpath_data=etree.HTML(data)
#xpath语法 1.节点 /
#           2.跨节点 //
#           3.精确的标签://a[@属性="属性值"]
#           4.标签包裹的内容 text()    (取文本)
#           5.属性:@href  (取url)
#               xpath--数据类型--list
#   xpath下标从1开始;只能取平级关系
#2.调用xpath的方法
#result=xpath_data.xpath('html/head/title//text()')
result=xpath_data.xpath('//a/text()')
result=xpath_data.xpath('//a[@mon="ct=1&a=1&c=top&pn=0"]/text()')
result=xpath_data.xpath('//a[@mon="ct=1&a=1&c=top&pn=0"]/@href')
result=xpath_data.xpath('//li/a[5]/text()')
print(result)


#高级语法:
#xpath的模糊查询 contains 格式如://div[contains@id,"normalthread"]包含id含normalthread的
#xpath的取下一个节点(平级关系):following-sibling::*

个人感觉,关键是在找待爬取信息的位置和共同点,比如要抓取论坛帖子的名字和链接,就看源码里有哪些共同点,比如相同的class属性或者例子中的mon属性,正则、xpath或者bs4就是3种不同的定位方式,三者中一个比一个更宏观吧,写起来也就更方便。不过总之,具体问题具体分析。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值