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)
View Code

 

 

posted @ 2021-09-27 14:37  Leguan001  阅读(71)  评论(0)    收藏  举报