Xpath解析器及其应用
概要
-
解析库之Xpath解析器
-
实战案例之爬取猪八戒数据

详情
-
解析库之Xpath解析器
Xpath解析器的效率很高,使用广泛,可以使用一条语句完成多步操作。
# 使用该解析器需要导入所在的模块 from lxml import etree # 将待匹配文本传入etree生成一个html文件对象 html = etree.HTML(doc)
主要功能
1.匹配所有标签 a = html.xpath('//*')

2.匹配指定标签 eg:匹配所有head标签 a = html.xpath('//head')

3.匹配子标签/后代标签 eg:匹配div标签内的所有儿子a标签 a = html.xpath('//div/a') 匹配body标签内所有后代a标签 a = html.xpath('//body//a') # 这里结果和上面相同

4.匹配父节点 eg:匹配body内部所有href=image1.html的后代a标签 a = html.xpath('//body//a[@href="image1.html"]') 匹配上述标签的父标签 a = html.xpath('//body//a[@href="image1.html"]/..')

5.按索引取值 eg:匹配body内部第一个后代a标签 索引从1开始取值 a = html.xpath('//body//a[1]') 匹配父标签的另一种写法 b = html.xpath('//body//a[1]/parent::*')

6.文本获取(一次性获取,无需循环) eg:匹配body内部所有后代a标签的文本 a = html.xpath('//body//a/text()')

7.属性获取(一次性获取,无需循环) eg:匹配body内部所有后代a标签的href属性值 a = html.xpath('//body//a/@href') eg:匹配title标签的id属性值 a = html.xpath('//title/@id')


8.属性多值匹配(同一属性匹配多个值) 标签有多个类,不能直接匹配,需要使用contains关键字 eg: 匹配body内部所有class=li的后代a标签 a = html.xpath('//body//a[@class="li"]') 匹配body内部所有class包含li的a标签的文本 a = html.xpath('//body//a[contains(@class,"li")]/text()')


9.多属性匹配(同时匹配多个属性) eg:匹配body内部所有class包含li或者name=items的a标签 a = html.xpath('//body//a[contains(@class,"li") or @name="items"]') 匹配body内部所有class包含li并且name=items的a标签的文本 a = html.xpath('//body//a[contains(@class,"li") and @name="items"]/text()')


10.按序选择 eg:匹配最后一个a标签的href属性值 a = html.xpath('//a[last()]/@href') 匹配位置小于3的(前两个) 使用position关键字定位 a = html.xpath('//a[position()<3]/@href') 匹配倒数第三个 a = html.xpath('//a[last()-2]/@href')



了解即可
11.节点轴选择 祖先标签关键字:ancestor eg:匹配所有a标签的所有祖先标签 a = html.xpath('//a/ancestor::*') 匹配所有a标签的祖先标签中的div标签 a = html.xpath('//a/ancestor::*')


12.标签内部所有的属性值 eg:匹配第一个a标签内部所有的属性值 a = html.xpath('//a[1]/attribute::*')

13.标签的儿子标签 eg:匹配第一个a标签所有的儿子标签 a = html.xpath('//a[1]/child::*')

14.所有的后代标签 eg:匹配第六个a标签所有的后代标签 a = html.xpath('//a[6]/descendant::*')

15.当前标签之后的所有标签 eg:匹配第一个a标签之后的所有标签 a = html.xpath('//a[1]/following::*') 匹配第一个a标签之后第一个标签的href属性值 a = html.xpath('//a[1/following::*[1]/@href]')


16.当前标签之后的所有同级标签 eg:匹配第一个a标签之后的所有同级标签 a = html.xpath('//a[1]/following-sibling::*') 匹配第一个a标签之后的所有同级的a标签 # 这里结果同上 a = html.xpath('//a[1]/following-sibling::a') 匹配第一个a标签之后第二个同级标签的文本 a = html.xpath('//a[1]/following-sibling::*[2]/text()') 匹配第一个a标签之后第二个同级标签的href值 a = html.xpath('//a[1]/following-sibling::*[2]/@href')



-
实战案例之爬取猪八戒数据
以python搜索结果为例
import requests from bs4 import BeautifulSoup from lxml import etree res = requests.get('https://shanghai.zbj.com/search/f/', params={'kw': 'python'} ) x_html = etree.HTML(res.text) # 分析标签特征并书写xpath语法筛选 # 1.先查找所有的外部div标签 div_list = x_html.xpath('/html/body/div[6]/div/div/div[2]/div[5]/div[1]/div') # 利用浏览器自动生成 # div_list = x_html.xpath('//div[@class="new-service-wrap"]/div') # 自己写 # 2.循环获取每一个div标签 for div in div_list: price = div.xpath('.//span[@class="price"]/text()') company_name = div.xpath('./div/div/a[1]/div[1]/p/text()') order_num = div.xpath('./div/div/a[2]/div[2]/div[1]/span[2]/text()') info = div.xpath('./div/div/a[2]/div[2]/div[2]/p/text()') print(info)



浙公网安备 33010602011771号