两万字详细爬虫知识储备,数据采集与清洗基础习题(一)头歌参考答案

数据采集习题参考答案,会持续更新,点个关注防丢失。为了方便寻找,按照头歌的门类从新整理了实训的分类,朋友们记得看标题哦,按标题寻找! 该篇为爬虫知识储备!

文章目录

实训一:HTML基础

第一关:初识HTML:简单的Hello World网页制作

第一关答案 

第二关:HTML结构:自我简介网页 

第二关答案 

实训二:HTML文本

第一关:HTML链接:带超链接的网页

第一关答案 

第二关:HTML标题与段落:网络文章网页

第二关答案 

第三关:HTML表格:日常消费账单表格展示网页

 第三关答案

实训三:HTML——基本标签

第一关创建第一个 HTML 标签

第一关答案 

第二关:创建 <h1>-<h6>

第二关答案 

第三关创建 p 标签

第三关答案 

第四关创建 a 标签

第四关答案 

第五关创建 img 标签

第五关答案 

第六关创建 div 标签

第六关答案 

第七关添加注释

第七关答案 

实训四:HTTP基础

第一关HTTP 标准

第一关答案 

第二关开发者工具的基本使用

第二关答案

实训五:Python——JSON基础 

第一关JSON篇:JSON基础知识

第一关答案 

第二关JSON篇:使用json库

实训六:Python——XPath基础 

第一关:XPath 路径表达式

第一关答案

第二关:XPath 轴定位

第二关答案

第三关:XPath 解析

第三关答案



HTML(Hypertext Markup Language,超文本标记语言)是一种用于创建Web页面和Web应用的标准化标记语言。在CSS(Cascading Style Sheets,级联样式表单)和JavaScript的帮助下,HTML已经成功构建了一整套面向Web的开发与应用平台。

1995HTML2.0面世,HTML陆续推出了得到广泛应用的HTML3.2HTML4.0标准,2014HTML5标准的面世使其在多媒体和移动性方面得到了全面提升,使HTML迎来了新的爆发式发展。

本习题面向零基础、入门级的Web技术学员,将介绍HTML的基本概念和结构,体验一个简单的Hello World网页制作过程,以及一个相对完整的Web页面的制作过程。

实训一:HTML基础

第一关:初识HTML:简单的Hello World网页制作

本关的任务是编写一个简单的HTML页面,这个网页包含一个标题和一个段落。显示效果如下:

预览大图

HTML是一种标准化的标记语⾔,由一套标记标签(markup tag)组成。Web前端开发人员的一项主要工作就是利用HTML标签来编写⽹页,将文本、超链接、图片、语音、视频等各种内容整合起来,实现绚丽多姿的网页。

下面是大家需要记住的关于HTML的一些基本描述:

  • HTML标记标签,通常简称HTML标签;

  • HTML文档,通常简称HTML页面、网页等;

  • HTML5能够较好的兼容HTML之前版本,但也废弃了一些旧的HTML特性。

  • <html></html><body></body><h1><p>等都是HTML标签;

  • <h1>这是一个一级标题</h1><p>这是第1个段落。</p>等都是HTML元素;

  • bgcolor="yellow"align="center"都是HTML元素的属性。

第一关答案 

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Hello World</title>
  </head>  
    <!--------- Begin-------->

  <body bgcolor='F6F3D6'>
    <!Hello World!-->
    <h1 align ='center'>Hello World</h1>
    <p align ='center'>动手改变世界</p>
  </body>
    <!--------- End-------->

</html>

第二关:HTML结构:自我简介网页 

本关任务是编写一个自我简介网页,你将通过本任务理解一个HTML网页的完整结构,并了解如何让搜索引擎更好的找到你的网页。

显示效果如下图所示:

预览大图

根元素:HTML 元素

然后,<HTML>元素告知浏览器其本身是一个HTML文档。

除去第一行外,其余的页面内容都应该包含在<HTML>元素中,所以它也被称为根元素。

头元素:head 元素

与属性会给元素增添附加信息一样,head元素能为整个网页增添更多信息。可以用在head中的标签有<base>, <link>, <meta>, <script>, <style>, 以及 <title>。在之后的学习中,你将逐渐的了解它们。

网页标题元素:title

本例网页主要内容是“自我简介”,所以title也设置为“自我简介”。 title元素的内容即网页标题,它是一个网页必需的元素之一。

<title>的内容一般作为网页标签名,写法如下:

<title>标题内容</title>

第二关答案 

<!DOCTYPE html>
<html>
    <!--------- Begin-------->

  <head>
    <title>自我简介</title>
    <meta charset="utf-8">

    <meta name="description" content="彭智广的自我简介网站">
    <meta name="keywords" content="自我简介,姓名,学号,班级">
  </head>
  <body>
    <h1 align="center">自我简介</h1>

    <h2>简介</h2>
    <p>在这里简单的描述一下你自己吧。</p>

    <h2>三个与你最有关的词</h2>
    <p>这三个词可以是一种形容,也可以是一种运动或者是一种独特的爱好,等等。</p>
    <ul>
        <li>第一个词</li>
        <p>选择第一个词的原因</p>
        <li>第二个词</li>
        <p>选择第二个词的原因</p>
        <li>第三个词</li>
        <p>选择第三个词的原因</p>
    </ul>
</body>
  <!--------- End-------->

</html>

实训二:HTML文本

第一关:HTML链接:带超链接的网页

本关的任务是编写一个带超链接的HTML页面,链接包含页面内导航链接和跳转其他网页的链接。显示效果如下:

预览大图

超链接是网页互连的核心,网页之间通过超链接连接在一起。

我们使用<a> 标签定义超链接。

一个简单的例子如下:

<a href="https://baidu.com">百度搜索</a>

点击a元素内容后打开百度搜索网页。

其中,href属性指定了超链接的目标,本例中即跳转到百度。

属性

href 属性

href 属性是超链接最重要的属性,它用于指定超链接目标的 URL。

典型的超链接格式如下:

<a href="URL">

其中,目标URL有三种类型:

  1. URL (anchor URL):指向同一页面内某一位置;

  2. 相对 URL (relative URL):指向同一网站的不同文件;

  3. 绝对 URL (absolute URL):指向另一个网站。

提示:

  • URLUniform Resource Locator,统一资源定位器;

  • 为什么叫作锚URL呢?

的含义取于船上的锚,船把锚沉在水底后,如果船随水飘移了,只要一拉锚的锁链就会回到抛锚的位置。同样的,在html中点锚链接就能回到指定位置。

第一关答案 

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>HTML链接</title>
    <meta name="description" content="HTML链接知识讲解">
    <meta name="keywords" content="HTML, Link">
</head>
  <!--------- Begin-------->

<body>
    <h1>HTML 入门</h1>
    <h2>本页目录</h2>
    <ul>
        <li><a href="#toc1">简介</a></li>
        <li><a href="https://en.wikipedia.org/wiki/CSS">第1关</a></li>
        <li><a href="#toc3">第2关</a></li>
    </ul>

    <h2 id="#toc3">简介</h2>
    <p>
        <a href="https://en.wikipedia.org/wiki/HTML"target="_blank"HTML</a>(Hypertext Markup Language,超文本标记语言)是一种用于创建Web页面和Web应用的标准化标记语言。在
        <a href="https://en.wikipedia.org/wiki/CSS"target="_blank">CSS</a>(Cascading Style Sheets,级联样式表单)和
        <a href="#toc3"target="_blank">JavaScript</a>的帮助下,HTML已经成功构建了一整套面向Web的开发与应用平台。</p>
    <p>自1995年HTML2.0面世,HTML陆续推出了得到广泛应用的HTML3.2和HTML4.0标准,2014年HTML5标准的面世使其在多媒体和移动性方面得到了全面提升,使HTML迎来了新的爆发式发展。</p>
    
    <h2 id="toc2">第1关</h2>
    <p>初识HTML:简单的Hello World网页</p>
    <h2 id="toc3">第2关</h2>
    <p>HTML链接:带超链接的网页</p>
    <hr>
    <p>若需帮助,请发送问题到<a href="mailto:someone@email.com">E-Mail</a>。</p>
    <p><a href="#">回到顶部</a></p>
</body>
  <!--------- End-------->

</html>

第二关:HTML标题与段落:网络文章网页

本关任务是完成一个格式丰富的文章网页,你将通过本关学习标题、段落、文本格式化和引用等,与文本相关的标签。

本关网页显示效果如下图所示:

预览大图

HTML提供了六级标题用于创建网页信息的层级关系。<h1> 定义重要等级最高的标题,之后<h2><h6>层级依次递减。

  1. <body>
  2. <h1>书籍标题</h1>
  3. <h2>第一章</h2>
  4. <h3>第一节</h3>
  5. <h4>重点 1</h4>
  6. <h5>1.1 标题</h5>
  7. <h6>1.1.1 标题</h6>
  8. </body>

第二关答案 

<!DOCTYPE html>

<head>
    <meta charset="UTF-8" />
    <title>HTML – 维基百科</title>
</head>
  <!--------- Begin-------->

<body>
    <h1>HTML</h1>
    <p>超文本标记语言(HTML)是一种标准化的用来创建Web页面和Web应用的标准化的
        <a href="https://en.wikipedia.org/wiki/Markup_language" title="Markup language" target="_blank">标记语言</a>。 在级联样式表单(CSS)和JavaScript的帮助下,HTML已经成功构建了一整套面向Web的开发与应用平台<sup><a href="#ref1">[1]</a></sup>。
    </p>
    <h2>历史</h2>
    <h3>开发过程</h3>
    <p>1980年,物理学家<a href="https://en.wikipedia.org/wiki/Tim_Berners-Lee" title="Tim Berners-Lee" target="_blank">Tim Berners-Lee</a>,
        <a href="https://en.wikipedia.org/wiki/CERN" title="CERN" target="_blank">CERN</a>的一位项目负责人,提出并实现了<a href="https://en.wikipedia.org/wiki/ENQUIRE" title="ENQUIRE" target="_blank">ENQUIRE</a>系统。该系统的目的是为CERN研究人员提供一种使用和分享文档。1989年, Berners-Lee写了一个备忘录,提出了基于Internet-based
        <strong>超文本系统</strong><sup><a href="#ref2">[2]</a></sup>。
    </p>
    <h3>HTML里程碑</h3>
    <dl>
        <dt>1995年11月24日</dt>
        <dd>HTML2.0发布,对应的IETF文档为<a class="external mw-magiclink-rfc" rel="nofollow" href="https://tools.ietf.org/html/rfc1866" target="_blank">RFC 1866</a>。</dd>
        <dt>1997年1月14日</dt>
        <dd>HTML 3.2以
            <a href="https://en.wikipedia.org/wiki/W3C_Recommendation" class="mw-redirect" title="W3C Recommendation" target="_blank">
                <abbr title="World Wide Web Consortium">W3C</abbr>推荐标准</a>的形式发布。 随后的HTML标准都由W3C组织发布。</dd>
        <dt>1997年12月18日</dt>
        <dd>HTML 4.0发布<sup><a href="#ref3">[3]</a></sup>。</dd>
        <dt>2014年10月28日</dt>
        <dd>HTML5 发布。</dd>
        <dt>2016年11月1日</dt>
        <dd>HTML 5.1发布。</dd>

    </dl>
    <h2>参考文献</h2>
        <ol>
        <small>
            <li id='ref1'>Flanagan, David. <i>JavaScript - The definitive guide</i> (6 ed.). p.&#160;1. "JavaScript is part of the triad of technologies that all Web developers must learn: HTML to specify the content of web pages, CSS to specify the presentation of web pages, and JavaScript to specify the behaviour of web pages."</li>
            <li id="ref2">Tim Berners-Lee, "Information Management: A Proposal." CERN (March 1989, May 1990). </li>
            <li id="ref3">"HTML 4.0 Specification — W3C Recommendation — Conformance: requirements and recommendations". World Wide Web Consortium. December 18, 1997. Retrieved July 6, 2015.</li>
        </small>
        </ol>
</body>
  <!--------- End-------->

</html>

第三关:HTML表格:日常消费账单表格展示网页

本关任务是编写一个日常消费账单表格展示网页,你将通过本关学习如何使用HTML编写出简洁清晰的表格。

本关网页显示效果如下图所示:

预览大图

HTML表中,一个表格(table)由行(tr)组成,每一行由单元格组成,单元格有标题单元格(th)和数据单元格(td)

  1. 我们设定了<table>元素的width属性,改变了表格的宽度;

  2. 我们使用<caption>元素设置了表格的标题;

  3. 数据第一行<tr>元素中,使用<th>元素指定了表头。本例中有三列信息,所以包含了三个<th>元素;

  4. 并且,我们设置了<th>元素的属性scope的值为col

 第三关答案

<!DOCTYPE html>
<html>
  <!--------- Begin-------->

<head>
    <meta charset="utf-8">
    <title>HTML表格</title>
    <meta name="description" content="HTML表格知识讲解">
    <meta name="keywords" content="HTML,表格, Table">
    <style type="text/css">
    table {
        border-collapse: collapse;
    }

    caption {
        font-weight: bold;
        margin-bottom: .5em;
    }

    th,
    td {
        padding: .5em .75em;
        border: 1px solid #000;
    }

    tfoot {
        font-weight: bold;
    }
    </style>
</head>

<body>
    <table  width="400" border="1" style="margin:auto">
        <caption>日常消费账单</caption>
        <thead>
            <!-- 表格头部 -->
            <tr>
                <th align="left" scope=co1>消费项目</th>
                <th align="right" scope=co1>一月</th>
                <th align="right" scope=co1>二月</th>
            </tr>
        </thead>
        <tbody>
            <!-- 表格主体 -->
            <tr>
                <th align="left" scope="row">食品烟酒</th>
                <td align="right">¥1241.00</td>
                <td align="right">¥1250.00</td>
            </tr>
            <tr>
                <th align="left" scope="row">衣物</th>
                <td align="right">¥330.00</td>
                <td align="right">¥594.00</td>
            </tr>
            <tr>
                <th align="left" scope="row">居住</th>
                <td align="right">¥2100</td>
                <td align="right">¥2100</td>
            </tr>
            <tr>
                <th align="left" scope="row">生活用品及服务</th>
                <td align="right">¥700.00</td>
                <td align="right">¥650.00</td>
            </tr>
            <tr>
                <th align="left" scope="row">医疗保健</th>
                <td align="right">¥150.00</td>
                <td align="right">¥50.00</td>
            </tr>
            <tr>
                <th align="left" scope="row">教育、文化和娱乐</th>
                <td align="right">¥1030.00</td>
                <td align="right">¥1250.00</td>
            </tr>
            <tr>
                <th align="left" scope="row">交通和通信</th>
                <td align="right">¥230.00</td>
                <td align="right">¥650.00</td>
            </tr>
            <tr>
                <th align="left" scope="row">其他用品和服务</th>
                <td align="right">¥130.40</td>
                <td align="right">¥150.00</td>
            </tr>
        </tbody>
        <tfoot>
            <!-- 表格尾部 -->
            <tr>
            
                <th align="left" scope="row">总计</th>
                <th align="right">¥5911</th>
                <th align="right">¥6694</th>
            </tr>
            </tfoot>
    </table>
</body>
  <!--------- End-------->

</html>

实训三:HTML——基本标签

第一关创建第一个 HTML 标签

本关任务:创建你的第一个标签<h1></h1>,文本内容为welcome to Educoder

实现的效果如下:

预览大图

<h1>welcome</h1>

上面这行代码它表示一个HTML元素

大多数 HTML 元素都是由开始标签结束标签组成的,通常成对出现 。

开始标签:用尖括号<>包裹关键词,像<h1>这样。 结束标签:用</>包裹和开始标签一样的关键词,像</h1>这样。

可以发现: 结束标签就比开始标签多了一个斜杠/

第一关答案 

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
    <h1>welcome to Educoder</h1>
    <!-- ********* Begin ********* -->

    <!-- ********* End ********* -->
</body>
</html>

第二关:创建 <h2>-<h6> 标签

本关任务:依次创建<h2>-<h6>标签,文本内容为创建不同字体大小的标题,查看它们的区别。

实现的效果如下:

预览大图

第一关已经创建了h1标签,它是干什么的呢? 它一般用来创建标题

另外,<h2>也用来创建标题,它们有什么区别呢? h1的字体比h2的字体要

当然, h3h4h5h6也用来创建标题,它们的字体依次减小。

注意:创建标题只有 <h1> - <h6>,没有 h7h8的。

第二关答案 

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
    <h1>创建不同字体大小的标题</h1>
    <!-- ********* Begin ********* -->
    <h2>创建不同字体大小的标题</h2>
    <h3>创建不同字体大小的标题</h3>
    <h4>创建不同字体大小的标题</h4>
    <h5>创建不同字体大小的标题</h5>
    <h6>创建不同字体大小的标题</h6>

    <!-- ********* End ********* -->
</body>
</html>

第三关创建 p 标签

本关任务:创建一个p标签,文本内容为我是一个段落

实现的效果如下:

预览大图

p元素通常用来表示一个段落。

你可以这样创建一个p标签,<p> p标签表示一个段落。</p>

第三关答案 

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
    <!-- ********* Begin ********* -->
    <p>我是一个段落</p>

    <!-- ********* End ********* -->
</body>
</html>

第四关创建 a 标签

本关任务:创建一个a标签, 跳转的地址是https://www.educoder.net,文本内容是Educoder平台

a标签通常用来定义一个链接。href属性的值就是链接的地址。

你可以这样创建一个a标签,<a href="http://www.baidu.com">百度</a>。当你点击这个链接时,它就会跳转到百度首页。

第四关答案 

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
    <!-- ********* Begin ********* -->
    <a href="https://www.educoder.net">Educoder平台</a>

    <!-- ********* End ********* -->
</body>
</html>

第五关创建 img 标签

本关任务:创建一个img标签, 图片的地址是https://www.educoder.net/attachments/download/207801,提示文字是小狗走路

效果如下: 

预览大图

img标签通常用来表示一个图片。src属性的值就是图片的地址,alt属性的值是当图片没有展现出来时提示的文字 。

你可以这样创建一个img标签, <img src="https://www.educoder.net/attachments/download/207791" alt="风景画"/>

这样图片就显示出来了。

第五关答案 

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
    <!-- ********* Begin ********* -->
    <img src="https://www.educoder.net/attachments/download/207801" alt="小狗走路"/>

    <!-- ********* End ********* -->

</body>
</html>

第六关创建 div 标签

本关任务:创建一个div标签, 文本内容是我是div标签

效果如下:

预览大图

div标签可以把文档分割为独立的、不同的部分。它没有实际的意义,仅仅表示创建了一个块级元素。

你可以这样创建一个div标签,<div>创建div标签</div>

可以发现:它和 <h1>-<h6><p>标签的创建是一样的,只不过它没有实际的意义。

第六关答案 

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
    <h2>我是h2标签</h2>
    <p>我是p标签</p>
    <!-- ********* Begin ********* -->
    <div>我是div标签</div>

    <!-- ********* End ********* -->
</body>
</html>

第七关添加注释

本关任务:注释掉 div 标签,同时在p标签上方添加注释说明。

什么是注释? 为什么要添加注释呢?

注释是解释性文本,在运行程序时,会被程序跳过,不做处理。

注释有两个作用:

  • 可以给代码添加文字说明,便于代码阅读和日后维护;
  • 对于暂时不用但又不能删除的代码,可以添加注释保存下来;

如何添加注释呢?

<!--表示注释的开始, -->表示注释的结束,这样就可以添加提示说明和注释元素了。

你可以这样注释p标签和添加文字说明。

第七关答案 

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
    <h2></h2>
    <!-- ********* Begin ********* -->
    <!--
    <div>
        
    </div>
    -->
    <!--一带一路-->

注:该代码为<p> 之前的代码

实训四:HTTP基础

HTTP 协议是 Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,减少网络传输。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪部分,以及哪部分内容优先显示等。python 爬虫开发,主要就是和 HTTP 协议打交道。 本实训主要介绍了网络爬虫的基础知识,包括 HTTP 的状态码、HTTP 消息头、HTTP 请求方式和 HTTP 工作原理等 HTTP 相关知识以及谷歌(Chrome)浏览器的开发者工具简介。

第一关HTTP 标准

本关任务:掌握 HTTP 的相关知识,完成相关选择题。

HTTP 是一个客户端终端和服务器端请求和应答的标准。通过使用网页浏览器、网络爬虫或者其它的工具,客户端发起一个 HTTP 请求到服务器上指定端口(默认端口为80)。我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源,比如 HTML 文件和图像。我们称这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个“中间层”,比如代理服务器、网关或者隧道(tunnel)。 尽管 TCP/IP 协议是互联网上最流行的应用,HTTP 协议中,并没有规定必须使用它或它支持的层。事实上,HTTP 可以在任何互联网协议上,或其他网络上实现。HTTP 假定其下层协议提供可靠的传输。因此,任何能够提供这种保证的协议都可以被其使用。因此也就是其在 TCP/IP 协议族使用 TCP 作为其传输层。 

第一关答案 

答案:1.B   2.B  3.D

第二关开发者工具的基本使用

本关任务:了解开发者工具对于爬虫的用途。

开发者工具是一套内置于浏览器中的 Web 开发和调试工具,可用来对网站进行迭代、调试和分析。 对于爬虫实战来说,可以通过开发者工具快捷的定位元素,获取中途请求文件和查看网页结构等极其强大与便捷的用途。  

第二关答案

答案:1.C   2.B

实训五:Python——JSON基础 

在现实世界中,人与人之间的交流,需要建立在某种大家都能听懂的语言基础上。而在计算机领域中,各个系统之间的交流通信,也需要建立在某种公共的格式上。 本次实训将介绍:JSON 数据格式,学习使用 Python 对它们进行解析的方法,以此拓展我们的知识面,让我们能写出更加实用的 Python 程序。

第一关JSON篇:JSON基础知识

本关任务:手动编写一个 JSON 格式的数据文件。

JSON 全称:JavaScript Object Notation(JavaScript 对象表示法),是一种轻量级的文本数据交换格式。与接下来要介绍的 XML 相比,拥有更小、更快、更易解析的特点。 

第一关答案 

{"count":3 , 
    "students":
    [
        {"name":"赵昊" , "age":15 , "ismale" :true },
        {"name":"龙傲天" , "age":16 , "ismale" :true},
        {"name":"玛丽苏" , "age":15 , "ismale" : false}
    ]
}

第二关JSON篇:使用json库

本关任务:编写一个能读取并修改 JSON 数据的程序。

json库是 Python 内置的一个用于操作 JSON 数据的库,提供了几个函数用于解析生成(或者说反序列化序列化)JSON 格式的数据。 

详情见此篇博文:

Python--JSON基础_宇阷的博客-CSDN博客

实训六:Python——XPath基础 

第一关:XPath 路径表达式

任务描述

本关任务:根据给定的 xml 文档,使用 XPath 表达式选取指定内容。

相关知识

为了完成本关任务,你需要了解 XPath 路径表达式的基本语法,理解节点的基本类型,完成节点的获取、属性的匹配获取、多属性的匹配获取、文本的获取、按序选择等。

节点的基本类型

XPath 是一门在 XML 文档中查找信息的语言,虽然是被设计用来搜寻 XML 文档的,但是它也能应用于 HTML 文档,并且大部分浏览器也支持通过 XPath 来查询节点。在 Python 爬虫开发中,经常使用 XPath 查找提取网页中的信息,因此 XPath 非常重要。

在 XPath 中, XML 文档是被作为节点树来对待的,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。树的根被称为文档节点或者根节点。

根节点(Root Node)

       根节点是一棵树的最顶层,根节点是唯一的。树上其它所有元素节点都是它的子节点或后代节点。对根节点的处理机制与其它节点相同。对树的匹配总是先从根节点开始。文档中的<bookstore>即为根节点。

元素节点(Element Nodes)

  元素节点相对应的是文档中每个元素,一个元素节点的子节点可以为元素节点、注释节点、处理指令节点和文本节点。元素节点可以定义一个唯一的标识(id)。元素节点可以有拓展名,由两部分组成:命名空间 URL 和本地命名。文档中的<book>即为元素节点。

文本节点(Text Nodes)

  文本节点包含一组字符数据,任何一个文本节点都没有相邻的兄弟文本节点,而且文本节点没有扩展名。文档中的Learning XML即为文本节点。

属性节点(Attribute Nodes)

  每个元素节点有一个相关联的属性节点集合,元素是每个属性节点的父节点,但属性节点却不是其父元素的子节点。这就是说,通过查找元素的子节点可以匹配出元素的属性节点,但反过来不成立,只是单向的。再有,元素的属性节点没有共享性,也就是说不同的元素节点不共有同一个属性节点。文档中的lang="eng"即为属性节点。

命名空间节点(Namespace Nodes)

  每个元素节点都有一个相关联的命名空间节点集。在 XML 文档中,命名空间是通过保留属性声明的。因此,在 XPath 中,该类节点与属性节点极为相似,它们与父元素之间的关系是单向的,并且不具有共享性。

处理指令节点(Processing Instruction Nodes)

  处理指令节点对应于 XML 文档中的每一条处理指令。它也有扩展名,扩展名的本地命名指向处理对象,而命名空间部分为空。

注释节点(Comment Nodes)

  注释节点对应于文档中的注释。

Xpath路径表达式的基本语法

XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是沿着路径(path)或者步(steps)来选取的。接下来介绍如何选取节点,首先了解一下常用的路径表达式,来进行节点的选取,如下表所示:

表达式描述
nodename选取此节点的所有子节点
/从根节点选取
//选择任意位置的某个节点
.选取当前节点
..选取当前节点的父节点
@选取属性

根据路径表达式的规则,我们对上文的的 XML 文档进行节点选取,如下表所示。

XPath路径表达式含义
bookstore选取 bookstore 元素的所有子节点
/bookstore选取根元素 bookstore
/bookstore/book/text()选取属于 bookstore 子元素的 book 元素下的所有文本内容
//book选取所有 book 子元素,而不管它们在文档中位置
//@eng选取名为 eng 的所有属性

谓语的用法如下表所示:

XPath路径表达式含义
/bookstore/book[1]选取属于 bookstore 子元素的第一个 book 元素
/bookstore/book[last()]选取属于 bookstore 子元素的最后一个 book 元素
/bookstore/book[last()-1]选取属于 bookstore 子元素的倒数第二个 book 元素
/bookstore/book[position()<3]选取最前面的两个属于 bookstore 元素的子元素的 book 元素
//title[@lang]选取所有拥有名为 lang 的属性的 title 元素
//title[@lang='eng']选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性
//title[@lang='eng' and @class="good"] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性和值为good的class属性
/bookstore/book[price>35.00]选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00
/bookstore/book[price>35.00]/title选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00

XPath 在进行节点选取的时候可以使用通配符*匹配未知的元素,同时使用操作符|一次选取多条路径,使用示例如下表所示:

XPath路径表达式含义
/bookstore/*选取 bookstore 元素的所有子元素
//*选取文档中的所有元素
//title[@*]选取所有带有属性的 title 元素
//book/title 丨 //book/price选取 book 元素的所有 title 和 price 元素
//title 丨 //price选取文档中的所有 title 和 price 元素
/bookstore/book/title 丨 //price选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素

第一关答案

1.选取bookstore元素的所有子节点
********** Begin *********
bookstore
*********** End **********

2.选取所有拥有名为 lang 的属性的 title 元素
********** Begin *********
//title[@lang]
*********** End **********

3.选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性和值为good的class属性
********** Begin *********
//title[@lang='eng' and @class="good"] 
*********** End **********

4.选取属于 bookstore 子元素的book元素下的所有文本内容
********** Begin *********
/bookstore/book/text()
*********** End **********

5.选取属于 bookstore 子元素的第一个 book 元素
********** Begin *********
/bookstore/book[1]

*********** End **********

第二关:XPath 轴定位

任务描述

本关任务:根据给定的 xml 文档,使用 XPath 表达式选取指定内容。

相关知识

为了完成本关任务,你需要了解:XPath 中如何使用轴定位。

在爬虫里面经常要用到定位,XPath 定位有着举足轻重的地位,因为它功能很强大。结合它里面的文本定位、模糊定位、逻辑定位等,基本能搞定所有的元素定位问题。

轴定义了所选节点与当前节点之间的树关系。在 Python 爬虫开发中,提取网页中的信息时,会遇到这种情况:首先提取到一个节点的信息,然后想在在这个节点的基础上提取它的子节点或者父节点,这时候就会用到轴的概念。轴的存在会使提取变得更加灵活和准确。

在上一关,我们了解了位置路径表达式中的相对位置路径、绝对位置路径和步的概念。位置路径可以是绝对的,也可以是相对的。绝对路径起始于正斜杠/,而相对路径不会这样。在两种情况中,位置路径均包括一个或多个步,每个步均被斜杠分割: /step/step/..(绝对位置路径),step/step/.. (相对位置路径)。

步(step)包括:轴(axis)、节点测试( node-test)、零个或者更多谓语( predicate),用来更深入地提炼所选的节点集。XPath 中的轴名及含义如下表所示:

轴名含义
ancestor选取当前节点的所有先辈(父或祖父等)
ancestor-or-self选取当前节点的所有先辈(父或祖父等)以及当前节点本身
attribute选取当前节点的所有属性
child选取当前节点的所有子元素
descendant选取当前节点的所有后代元素(子或孙等)
descendant-or-self选取当前节点的所有后代元素(子或孙等)以及当前节点本身
following选取文档中当前节点的结束标签之后的所有节点
namespace选取当前节点的所有命名空间节点
parent选取当前节点的父节点
preceding选取文档中当前节点的开始标签之前的所有节点
preceding-sibling选取当前节点之前的所有同级节点
self选取当前节点

轴的使用

轴需要通过步的语法,来实现节点的选取。步的语法为:轴名称::节点测试[谓语],大家可能觉比较抽象。下面通过案例演示来帮助理解,XML 文档示例如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book>
  <title lang="eng" class="good">Harry Potter</title>
  <price>29.99</price>
</book>
<book>
  <title lang="eng">Learning XML</title>
  <price>39.95</price>
</book>
</bookstore>

第二关答案

1.选取所有属于当前节点的子元素的 book 节点
********** Begin *********        
child::book
*********** End **********

2.选取当前节点的 lang 属性
********** Begin *********        
attribute::lang
*********** End **********

3.选取当前节点的所有 price 孙节点
********** Begin *********        
child::*/child::price
*********** End **********

第三关:XPath 解析

任务描述

本关任务:编写解析 HTML 文件的 Python 程序。

相关知识

为了完成本关任务,你需要掌握:Python 环境下使用 XPath 对 HTML 文件进行解析。

lxml的安装

lxml 是 一个 HTML/XML 的解析器,主要的功能是解析和提取 HTML/XML 数据。lxml 和正则一样,也是用 C 实现的,是一款高性能的 Python HTML/XML 解析器,我们可以利用之前学习的 XPath 语法,来快速地定位特定元素以及节点信息。

如果本地 Python 环境没有安装 lxml,可以在命令提示符窗口输入命令pip install lxml,安装 lxml 模块,如下图所示。

lxml的使用

使用 lxml,需要先导入相关包,语法如下:

  1. from lxml import etree

现在有如下 HTML 代码,需要获取第一个 book 节点下的 title 节点中的 class 的属性值:

  1. <html>
  2. <head></head>
  3. <body>
  4. <bookstore>
  5. <book>
  6. <title lang="eng" class="good">Harry Potter</title>
  7. <price>29.99</price>
  8. </book>
  9. <book>
  10. <title lang="eng">Learning XML</title>
  11. <price>39.95</price>
  12. </book>
  13. </bookstore>
  14. </body>
  15. </html>

使用 xpath 表达式解析网页之前,需要获取元素树对象,这里有两种方法:

  • 如果上述代码为本地文件,并且文件名为test.html,获取元素树对象的代码如下所示:
    1. parse = etree.HTMLParser(encoding='utf-8') # 添加编码
    2. tree = etree.parse('test.html', parse) # 指定本地HTML文件读取
  • 如果上述代码为字符串类型变量,并且变量名为html,获取元素树对象的代码如下所示:
    1. parse = etree.HTMLParser(encoding='utf-8') # 添加编码
    2. tree = etree.HTML(html, parse) # html为python字符串

获取元素树对象后,就可以使用 XPath 表达式解析网页了,代码如下所示:

  1. result = tree.xpath(xpath表达式) # 返回类型为列表

完成上述指定任务有多种实现方式,以下演示了四种不同的 XPath 表达式,都能够获取第一个 book 节点下的 title 节点中的 class 的属性值。

  1. # 相对路径 book 节点选择
  2. print(tree.xpath('//book[1]/title/@class')[0])
  3. # 相对路径 title 节点存在 class 属性条件选择
  4. print(tree.xpath('//title[@class]/@class')[0])
  5. # 同上, 但是使用了轴选择 class 属性值
  6. print(tree.xpath('//title[@class]/attribute::class')[0])
  7. # 绝对路径常规选择
  8. print(tree.xpath('/html/body/bookstore//book[1]/title/@class')[0])

以上代码都可以获取图中红框部分的内容。

,

第三关答案

# 导入lxml库
from lxml import etree
# 读取lll.html文件并转化为元素树对象
parse = etree.HTMLParser(encoding='utf-8')
tree = etree.parse('src/step3/lll.html', parse)
# 补充xpath表达式,获取所有书的名称
# ********** Begin ********* #       
print(tree.xpath('//bookstore/book/title/text()'))
# *********** End ********** #
# 补充xpath表达式,获取所有书的价格
# ********** Begin ********* #       
print(tree.xpath('//bookstore/book/price/text()'))
# *********** End ********** #
# 填写代码, 获取价格低于30的书名
# ********** Begin ********* #       
print(tree.xpath('//bookstore/book[price < 30.00]/title/text()')[0])
# *********** End ********** #

在学习中成功、在学习中进步!我们一起学习不放弃~

记得三连哦~ 你们的支持是我最大的动力!!欢迎大家阅读往期文章哈~

小编联系方式如下,欢迎各位巨佬沟通交流,代码什么的加小编私聊哦~

  • 57
    点赞
  • 255
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饲养猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值