zoukankan      html  css  js  c++  java
  • xpath教程一---简单的标签搜索

    工具

    • Python3版本
    • lxml库【优点是解析快】
    • HTML代码块【从网络中获取或者自己杜撰一个】
    • requests【推荐安装,从网页上获取网页代码练手,再好不过了】

    讲解

    网页代码都是成对的标签,基础结构如下

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <!--网页头部信息-->
        <title>网页名</title>
    </head>
    <body>
        <!--下面是网页正文-->
        <div>
            div-text
        </div>
    </body>
    </html>
    
    • 最外部肯定是html,所有的html代码基本都是放这里面
    • html内部分两块,一块是头head,另一块是身体body
    • head部主要是放网页名、一些申明、和SEO优化的东西
    • body部分就是浏览器显示的内容

    网页结构基本都是如此,一般有价值的数据都是在body中

    现在开始学习Xpath

    • 第一步:杜撰一个HTML代码块
    html_str = """
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>网页名</title>
    </head>
    <body>
        <div>
            div-text
            <span>span-text</span>
            <a>a-text</a>
            <p>p-text</p>
        </div>
        <table>
            <tr>
                <th>Heading</th>
                <th>Another Heading</th>
            </tr>
            <tr>
                <td>row 1, cell 1</td>
                <td>row 1, cell 2</td>
            </tr>
            table-text-2
        </table>
    </body>
    </html>
    """
    
    • 第二步:检测Python和lxml库
    from lxml import etree
    html = etree.HTML(html_str)
    

    这段代码是从lxml中导入etree,然后将前面杜撰的一个html_str字符串通过etree.HTML函数,解析成支持xpath的数据类型,并保存到html变量中

    两段代码链接起来,成功运行,那就说明lxml库正常

    下面就到了写 xpath 路径的时候了

    • 任务一:解析出head里面的title标签的值【即 ‘网页名’】

      • 获取网页名的值,是使用title/text()来获得,
      • title标签是head的子级
      • head标签就是最外部的标签
      • 所以整个的xpath路径是head/title/text()
      • 最后的python代码就是print(html.xpath('head/title/text()'))。这样就打印出了一个列表['网页名']
    • 任务二:解析出div标签下spanap标签里面的值

      • span标签值对应的xpath路径是body/div/span/text(),结果['span-text']
      • a标签值对应的xpath路径是body/div/a/text(),结果['a-text']
      • p标签值对应的xpath路径是body/div/p/text(),结果['p-text']
    • 任务三:试着解析div标签的text()

      • 就任务而言,任务三比任务二还轻松点,能获取div的子级标签值,获取父级也挺简单
      • div对应的xpath路径是body/div/text()
      • 得到的结果是这样的[' div-text ', ' ', ' ', ' ']
      • 这里必须对结果好好解释下。首先是div里面有三个子级标签,这三个都不算做text()。如果没有子级,得到的结果列表就是一个元素;有两个子级,则列表有三元素;就像一根面条被切了两次,就有三根面条出现。【不是对着切(ˉ▽ ̄~) ~~】
      • 另外 /n是换行
    • 任务四:解析thtd的文本值
      • 这次thtd都有两个标签,首先按前面的方式来写路径
      • 通过body,再到table,然后是tr,再是thtd
      • 最终的xpath是body/table/tr/th/text()body/table/tr/td/text()
      • 运行结果['Heading', 'Another Heading']['row 1, cell 1', 'row 1, cell 2']

    最终的代码和运行截图

    html_str = """
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>网页名</title>
    </head>
    <body>
        <div>
            div-text
            <span>span-text</span>
            <a>a-text</a>
            <p>p-text</p>
        </div>
        <table class="2">
            <tr>
                <th>Heading</th>
                <th>Another Heading</th>
            </tr>
            <tr>
                <td>row 1, cell 1</td>
                <td>row 1, cell 2</td>
            </tr>
            table-text-2
        </table>
    </body>
    </html>
    """
    
    from lxml import etree
    
    html = etree.HTML(html_str)
    print(html.xpath('head/title/text()'))
    print(html.xpath('body/div/span/text()'))
    print(html.xpath('body/div/a/text()'))
    print(html.xpath('body/div/p/text()'))
    print(html.xpath('body/div/text()'))
    print(html.xpath('body/table/tr/th/text()'))
    print(html.xpath('body/table/tr/td/text()'))
    

    xpath_1

    版权声明:允许转载,转载请注明出处 —— 《xpath教程》: 简单的标签搜索

  • 相关阅读:
    window系统中,解决Pycharm 文件更改目录后,执行路径未更新问题(转)
    yum安装软件报错–skip-broken(卸载的时候一直报错:未安装软件包)
    selenium之Chrome浏览器与chromedriver对应关系和下载
    Python 第三方库 批量下载安装包,离线批量安装Python第三方库
    UIpath 循环读取IMAP邮件,并保存附件
    UIpath 中如何使用 正则表达式
    用python实现队列,堆栈
    python-反射
    Python基础-父类对子类的约束
    Python基础-类的继承顺序
  • 原文地址:https://www.cnblogs.com/brady-wang/p/8946102.html
Copyright © 2011-2022 走看看