xpath和正则、bs4都属于解析网页源码的方法,一般来说应该bs4最简便、用的最多吧?
这部分可以当个web基础来看
综合百度、部分网上的文章和学到的内容,写个初版本,还有函数什么的老师没讲我也就没看。
关于xpath(太过概念了感觉基本可以跳过直接看代码来理解)
XPath=XML路径语言(XML Path Language),是一种用来确定XML文档中某部分位置的语言。
XML文档被作为节点树,以路径表达式的形式来指定元素。
被开发者用来当作小型查询语言。返回值可能是节点,节点集,字符串,逻辑值,数字以及混合等。
可以概括为4个方面:节点、语法、轴、运算符
-
节点
7种类型:
1 元素
2 属性
3 文本
4 命名空间
5 处理指令
6 注释
7 文档节点(根节点)
节点关系:
1 父Parent
2 子Children
3 同胞Sibling
4 先辈Ancestor
5 后代Descendant -
轴
轴可定义相对于当前节点的节点集。
每个步均根据当前节点集之中的节点来进行计算。
(说明详见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的节点。下面列出了最有用的路径表达式:
路径表达式实例:
-
运算符
下面列出了可用在 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种不同的定位方式,三者中一个比一个更宏观吧,写起来也就更方便。不过总之,具体问题具体分析。