数据采集习题参考答案,会持续更新,点个关注防丢失。为了方便寻找,按照头歌的门类从新整理了实训的分类,朋友们记得看标题哦,按标题寻找! 该篇为爬虫知识储备!
文章目录
实训一: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
的开发与应用平台。
自1995
年HTML2.0
面世,HTML
陆续推出了得到广泛应用的HTML3.2
和HTML4.0
标准,2014
年HTML5
标准的面世使其在多媒体和移动性方面得到了全面提升,使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有三种类型:
-
锚
URL (anchor URL)
:指向同一页面内某一位置; -
相对
URL (relative URL)
:指向同一网站的不同文件; -
绝对
URL (absolute URL)
:指向另一个网站。
提示:
-
URL
:Uniform 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>
层级依次递减。
<body>
<h1>书籍标题</h1>
<h2>第一章</h2>
<h3>第一节</h3>
<h4>重点 1</h4>
<h5>1.1 标题</h5>
<h6>1.1.1 标题</h6>
</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. 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)
。
我们设定了
<table>
元素的width
属性,改变了表格的宽度;我们使用
<caption>
元素设置了表格的标题;数据第一行
<tr>
元素中,使用<th>
元素指定了表头。本例中有三列信息,所以包含了三个<th>
元素;并且,我们设置了
<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
的字体要大。
当然, h3
,h4
,h5
,h6
也用来创建标题,它们的字体依次减小。
注意:创建标题只有 <h1> - <h6>
,没有 h7
,h8
的。
第二关答案
<!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,需要先导入相关包,语法如下:
from lxml import etree
现在有如下 HTML 代码,需要获取第一个 book 节点下的 title 节点中的 class 的属性值:
<html>
<head></head>
<body>
<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>
</body>
</html>
使用 xpath 表达式解析网页之前,需要获取元素树对象
,这里有两种方法:
- 如果上述代码为本地文件,并且文件名为
test.html
,获取元素树对象
的代码如下所示:parse = etree.HTMLParser(encoding='utf-8') # 添加编码
tree = etree.parse('test.html', parse) # 指定本地HTML文件读取
- 如果上述代码为字符串类型变量,并且变量名为
html
,获取元素树对象
的代码如下所示:parse = etree.HTMLParser(encoding='utf-8') # 添加编码
tree = etree.HTML(html, parse) # html为python字符串
获取元素树对象
后,就可以使用 XPath 表达式解析网页了,代码如下所示:
result = tree.xpath(xpath表达式) # 返回类型为列表
完成上述指定任务有多种实现方式,以下演示了四种不同的 XPath 表达式,都能够获取第一个 book 节点下的 title 节点中的 class 的属性值。
# 相对路径 book 节点选择
print(tree.xpath('//book[1]/title/@class')[0])
# 相对路径 title 节点存在 class 属性条件选择
print(tree.xpath('//title[@class]/@class')[0])
# 同上, 但是使用了轴选择 class 属性值
print(tree.xpath('//title[@class]/attribute::class')[0])
# 绝对路径常规选择
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 ********** #
在学习中成功、在学习中进步!我们一起学习不放弃~
记得三连哦~ 你们的支持是我最大的动力!!欢迎大家阅读往期文章哈~
小编联系方式如下,欢迎各位巨佬沟通交流,代码什么的加小编私聊哦~