阅读 70

Xpath解析器

解析库之Xpath解析器

  该选择器可以做到一句话完成多步操作

1.导入xpath所在模块

from lxml import etree

2.将待匹配的文本传入etree生成一个对象

html = etree.HTML(doc)

3.xpath解释器主要功能

  1.所有节点

a = html.xpath(//*)    # 匹配所有的标签

  2.指定节点(结果为列表)

a = html.xpath(//head)    # 匹配所有的head标签

  3.子节点,子孙节点

a = html.xpath(//div/a)    # 匹配div标签内部所有的儿子a标签
a = html.xpath(//body/a)    # 没有符合条件的儿子a
a = html.xpath(//div//a)    # 匹配div标签内容所有的后代a标签
a = html.xpath(//boay//a)    # 也可以匹配到

   4.父节点

a = html.xpath(//boay//a[@href="image1.html"])    # 属性查找,获取body内部所有的href=image1.html后代a
a = html.xpath(//body//a[@href="image1.html"]/..)    # .. 表示查找上一级父标签
a = html.xpath(//title[@id="t1"]/..)    # ..表示查找上一级父标签
a = html.xpath(//body//a[1])    # 从1开始取值
‘‘‘xpath选择器中中括号内部可以放属性也可以放位置数,从1开始‘‘‘

   也可以这样(了解)

a = html.xpath(//body//a[1]/parent::*)

   5.文本获取

a = html.xpath(//body//a[@href="image1.html"]/text())
a = html.xpath(..body//a/text())    # 获取body内部所有后代a标签内部文本(一次性获取不需要循环)

   6.属性获取

a = html.xpath(//body//a/@href)    # 获取body内部所有后代a标签href属性值(一次性获取不需要循环)
a = html.xpath(//title/@id)    # 获取title标签id属性值
# 注意从1开始取(不是从0)
a = html.xpath(//body//a[2]/@href)

   7.属性多值匹配

a标签有多个class类,直接匹配就不可以了,需要用contains

a = html.xpath(//body//a[@class="li"])    # 写等号就表示等于,不是包含
a = html.xpath(//body//a[contains(@class,"li")]/text())    # 包含需要使用关键字contains

  8.多属性匹配

查找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())

   9.按序选择

取最后一个

a = html.xpath(//a[last()]/@href)

位置小于3的

a = html.xpath(//a[position()<3]/@href)    # position()关键字用于定位

倒数第三个

a = html.xpath(//a[last()-2]/@href)

 了解

  10.节点轴选择

ancestor:祖先节点

使用*获取所有祖先节点

a = html.xpath(//a/ancestor::*)

获取祖先节点中的div

a = html.xpath(//a/ancestor::div)

attribute:属性值

a = html.xpath(//a[1]/attribute::*)  # 查找a标签内部所有的属性值

child:直接子节点

a = html.xpath(//a[1]/child::*)

descendant:所有子孙节点

a = html.xpath(//a[6]/descendant::*)

following:当前节点之后所有节点

a = html.xpath(//a[1]/following::*)
a = html.xpath(//a[1]/following::*[1]/@href)

following-sibling:当前节点之后同级节点

a = html.xpath(//a[1]/following-sibling::*)
a = html.xpath(//a[1]/following-sibling::a)
a = html.xpath(//a[1]/following-sibling::*[2]/text())
a = html.xpath(//a[1]/following-sibling::*[2]/@href)
print(a)

xpath爬取猪八戒数据

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)
"""
研究./div/div/a[2]/div[2]/div[1]/span[2]表达式作用
"""

 

原文:https://www.cnblogs.com/wyhb/p/15342775.html

文章分类
百科问答
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐