Python爬虫入门 ~ xpath基本使用

62 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情

xpath

简介

XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。

XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初XPath的提出的初衷是将其作为一个通用的、介于XPointer与XSL间的语法模型。但是XPath很快地被开发者采用来当作小型查询语言

点击 → 查看更多

插件安装

  1. 浏览器插件

下载 XPath Helper 并安装到浏览器,安装完成之后重启浏览器,当看到小黑框时则表示安装成功。(唤起快捷键Ctrl + Shift + X)

image.png

image.png

  1. 安装lxml
pip install lxml -i https://pypi.douban.com/simple

image.png

基本使用

  1. 导入lxml.etree
from lxml import etree
  1. 解析本地文件
etree.parse()
  1. 服务器响应文件
etree.HTML(response.read().decode('utf-8'))
  1. xpath

基本语法

演示页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>xpath基本使用</title>
</head>
<body>
    <ul>
        <li></li>
        <li></li>
        <li>广</li>
        <li></li>
    </ul>
</body>
</html>
  1. 路径查询
  • //:查找所有子孙节点,不考虑层级
  • /:只找子节点
from lxml import etree

tree = etree.parse("xpath基本使用.html")

# 不考虑层级
li_list = tree.xpath("//body//li")
print(len(li_list))

# 只查找子级
li_list = tree.xpath("//body/li")
print(len(li_list))

image.png

ps: 有的小伙伴可能直接把对象打印出来了,却发现并不是你想要的内容是吧?要查看内容的可以直接跳到第5点内容查看。

  1. 谓词查询
  • //div[@id]:找到带有id属性的标签
  • //div[@id="l1"]:找到带有id属性,且值为l1的标签
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>xpath基本使用</title>
</head>
<body>
    <ul>
        <li id="l1"></li>
        <li id="l2"></li>
        <li>广</li>
        <li></li>
    </ul>
</body>
</html>
# 查找带有id属性的标签
li_list = tree.xpath("//body//li[@id]/text()")
print(li_list)

# 找到带有id属性,且值为`l1`的标签
li_list = tree.xpath("//body//li[@id='l1']/text()")
print(li_list)

image.png

  1. 属性查询
  • //@class:获取标签的class属性值
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>xpath基本使用</title>
</head>
<body>
    <ul>
        <li id="l1" class="bei"></li>
        <li id="l2"></li>
        <li>广</li>
        <li></li>
    </ul>
</body>
</html>
from lxml import etree

tree = etree.parse("xpath基本使用.html")

li_list = tree.xpath("//body//li[@id='l1']/@class")
print(li_list)

image.png

  1. 模糊查询
  • //div[contains(@id, "b")]:查找标签中id属性包含b的标签
  • //div[starts-with(@id, "l")]:查找标签中id属性以l开头的标签
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>xpath基本使用</title>
</head>
<body>
    <ul>
        <li id="l1" class="bei"></li>
        <li id="l2"></li>
        <li id="b1">广</li>
        <li id="b2"></li>
    </ul>
</body>
</html>
# 查找标签中`id`属性包含`b`的标签
li_list = tree.xpath("//body//li[contains(@id, 'b')]/text()")
print(li_list)

# 查找标签中`id`属性以`l`开头的标签
li_list = tree.xpath("//body//li[starts-with(@id, 'l')]/text()")
print(li_list)

image.png

  1. 内容查询
  • //div/h1/text():显示标签内容
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>xpath基本使用</title>
</head>
<body>
    <ul>
        <li id="l1" class="bei"></li>
        <li id="l2"></li>
        <li id="b1">广</li>
        <li id="b2"></li>
    </ul>
</body>
</html>
from lxml import etree

tree = etree.parse("xpath基本使用.html")

li_list = tree.xpath("//body//li/text()")
print(li_list)

image.png

  1. 逻辑运算
  • //div[@id="l1" and @class="bei"]:查找两个条件同时成立的标签
  • //div1 | //div2:查找符合条件的标签
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>xpath基本使用</title>
</head>
<body>
    <ul>
        <li id="l1" class="bei"></li>
        <li id="l2"></li>
        <li id="b1">广</li>
        <li id="b2"></li>
    </ul>
    <span>SPAN</span>
</body>
</html>
# 查找两个条件同时成立的标签
li_list = tree.xpath("//body//li[@id='l1' and @class='bei']/text()")
print(li_list)

# 查找符合条件的标签
li_list = tree.xpath("//body//li[@id='l1']/text() | //body//span/text()")
print(li_list)

image.png