基于R语言的自动数据收集:网络抓取和文本挖掘实用指南【1.2】

张开发
2026/4/7 19:20:31 15 分钟阅读

分享文章

基于R语言的自动数据收集:网络抓取和文本挖掘实用指南【1.2】
第2章 HTML在网络上浏览时我们阅读和操作的几乎所有内容的背后都隐藏着一个标准超文本标记语言Hyper Text Markup LanguageHTML。不管是我们在维基百科上查找信息在Google搜索站点查看我们的银行账号还是在Twitter、Facebook和YouTube上进行社交活动只要使用浏览器就在使用HTML。HTML是一种用于展示网上内容的语言由Tim Berners-Lee于1989年首次提出。在问世之后这个标准经历了持续演化最近的版本是由万维网联盟W3C和网络超文本应用技术工作组WHATWG[1]制定的HTML5标准。尽管HTML的每个修订版都会提出新的特性并重构旧的特性但是HTML网页的基本语法在这些年并没有多少变化在可预见的未来应该也会保持相对稳定这使它成为网络相关工作最重要的标准之一。本章会从网络数据采集者的角度对HTML的基础知识进行介绍。我们会学习如何使用浏览器显示网页的源代码并查看特定的HTML元素见2.1节。在2.2节会总体分析标记语言的逻辑以及HTML作为标记语言具体实例的语法。之后我们继续讲解HTML中最重要的一些词汇见2.3节。最后在2.4节我们会分析解析过程即重新组织HTML网页结构和语义的过程以及这个过程是如何帮助我们从网页上获取信息的。[1] W3C负责为网络技术制定标准。它是由Tim Berners-Lee创建的现在有几十位工作人员及数以百计的单位会员参见www.w3.org。在本书的学习过程中我们主要接触W3C原因就是他们推荐的技术。例如HTML、XML、HTTP和其他在本书中讨论的技术都是由W3C推荐的。W3C的支持对于网络开发者是一个强烈的信号说明他们能够而且应该依赖这些技术。2.1 浏览器显示及源代码其实HTML文件无非一些纯文本而已它可以用任何文本编辑器打开和编辑。让HTML产生强大功能的是它的标记结构。HTML标记让我们能定义文档的某些部分作为标题显示、某些部分包含链接、某些部分作为表格来组织还有其他多种形式。标记定义依赖于预先定义好的字符序列即标签来封装文本部分。标记会告诉浏览器更准确地说是解析器见2.4节文档的结构及其各部分的作用。所以你在浏览器里看到的并不是HTML网页而是它的一个解释。让我们用一个小例子来详细说明这个思路。图2-1和图2-2显示了同一个HTML网页即OurFirstHTML.html。图2-1显示该文档的解释版本这是我们习以为常的形式而图2-2显示了该文档的源代码。自己试试看。用你的浏览器访问http://www.r-datacollection.com/materials/html/OurFirstHTML.html。在窗口中右键点击并从下拉菜单中选择“查看源代码”。现在你还可以看看其他的网站并查看它们的源代码。在正常情况下没有什么理由非要去查看源代码但对在线数据采集工作来说这往往是很关键的。顺便说一句在本章的讲解过程中当介绍HTML的具体格式时我们会引用到一些补充文件它们都可以在http://www.r-datacollection.com/materials/html/找到。貌似源代码里的很多信息在文档的解释过程中丢失了。毕竟和我们在图2-1中看到的单个句子相比源代码里的文本要多得多。实际上结构性信息和实质性内容两者之间就规模而言显然是前者占优。源代码中相当数量的文本包含的是给浏览器的指示这些内容是不会显示在屏幕上的。然而结构性信息也有一部分实际上是会显示的不过它的显示方式更不易察觉。看一下图2-1中浏览器分页的标题栏。页面标题是First HTML它在源代码中被定义成titleFirst HTML/title。这就是实际起作用的HTML标记“First HTML”用title和/title进行标记它就被定义为该网页的标题。要识别源代码的哪部分对应于浏览器窗口里的哪些元素反之亦然我们可以使用元素检查器它在大部分浏览器中都可以实现。同上你可以自己尝试一下。在我们之前打开的浏览器窗口里选中某个句子在窗口里右键点击并从下拉菜单里选择“检查元素”。浏览器会显示对应于所选元素的HTML网页片段如图2-3所示。我们也可以反过来点击源代码片段来标出文档解释版本中对应的片段。你还可以尝试在其他网站重复上述步骤并开始检查元素。2.2 语法规则既然我们已经尝试过第一个HTML网页了解了网页的解释版本及其源代码的差别现在更深入地了解作为HTML基础的一些规则和概念。[1]2.2.1 标签、元素和属性纯文本是通过浏览器可解析的标签转化成HTML网页的。标签可以看作带有名字的一对括号它们把内容包装在里面并定义它的结构化功能。例如在我们前面的入门例子里的title标签会指定其中包装的文本作为在浏览器分页的标题栏显示的标题。起始标签、内容和终止标签组合起来称为元素如下所示起始标签和终止标签也被称为开放和闭合标签。标签通常用“”和“”符号包起来以便和内容区分。起始和终止标签里面包含相同的名字但终止标签的名字之前有个斜杠/。当指示一个元素的时候通常会忽略大于号和小于号只使用标签内部的名字如body标签、title标签等。我们有时会发现元素和标签在使用中其实是同义的。在本书中我们会引用起始标签如name来代表整个元素。虽然推荐的做法是每个元素都有一个起始标签和一个终止标签但这并不是对所有的元素类型都普遍适用。例如br标签代表换行它就不需要用一个/br标签来闭合。有些标签也可以通过在起始标签内部的末尾增加一个斜杠来闭合如body/。我们称这样的元素为空元素因为它们不包含任何内容。否则它们就必须写成body/body的形式。把一个标签写成tagname、TAGNAME、TagName或其他任何大小写字母的组合都是可以的因为标准的HTML不区分大小写。尽管如此推荐的做法是永远都使用小写字母如tagname。标签的另一个特性是属性。一个广泛使用的属性如下所示这个链接标签a能够把相关的文本这里是“Link to Homepage”和一个指向另一个地址的超链接即http://www.rdatacollection.com/关联起来。hrefhttp://www.r-datacollection.com/这个属性指定锚链接。浏览器会自动把这类元素转化为带有下划线并且可以点击的样式。总体而言属性让标签能够描述其内容处理方式的选项。哪些属性可以使用是根据具体的标签来决定的。属性总是位于起始标签内部标签名的右侧。一个标签可以有多个属性用空格分开。属性用名字-取值的配对形式表示如namevalue。取值用单引号或双引号封闭都是可以的。不过如果属性值本身已经包含了一种引号就只能用另外一种引号封闭这个属性值。2.2.2 树形结构我们从另外一个角度来审视图2-4里OurFirstHTML.html的源代码。先暂时忽略DOC TYPE html这个例子里的第一个元素就是html元素。在这个元素的起始标签和终止标签之间又有几个标签分别起始和闭合headtitle和body。head和body标签是直接被html元素包含的而title标签则包含在head标签内。要描述一个HTML网页的这种多层结构用树来进行类比是一种好的方式。图2-5描述了OurFirstHTML.html的简单树形结构。html元素是根元素它带有两个分支即head和body。head下面又有另一个叫title的分支。在结构良好并且合法的HTML文件中所有元素相互之间必须是严格嵌套的。一对起始和闭合标签必须完全包含在另一对起始和闭合标签之内。一个显然违反了该规则的例子如下所示2.2.3 注释HTML提供了向代码中插入注释的能力注释是不会被解析的因此不会在浏览器里显示出来。注释的标记方式是用--开头并用--结尾。在这两组字符序列之间的所有文本都会被忽略。在实践中一段注释如下所示注意注释仍然是文档的一部分任何查看页面源代码的人都可以看到它们。2.2.4 保留字符和特殊字符保留字符在语言里用于控制目的。我们已经知道HTML内容是用纯文本编写的对于文档里的标记和内容部分都是如此。因为有些字符是标记所需要的所以它们不能原封不动地用在内容中。例如我们已经知道和在HTML里是用来构成标签的。它们就是标记字符。假设我们要在浏览器里显示这个内容56but 73。简单地把它们放到HTML文件里是不行的如下所示因为解析器会把和解释为闭合了一个标签名。为了在浏览器窗口里原样显示这些字符HTML依赖于特定的字符序列这些序列叫作字符实体简称实体。所有的实体以一个符号开头以一个分号结尾。这样和就能以它们的实体表达式和放到文件的内容中了。在解析HTML文件的时候浏览器就会显示这些实体代表的字符。因此上面的例子就需要写成如下格式因为HTML网页可以用很多种语言编写而这些语言常常会包含简单拉丁字符之外的字符如 、 或 所以会有份很长的实体列表每条都以一个符号开头以一个分号结尾。表2-1列出了一些字符及其实体表达式的例子。注意实体用编号或名称来写都是可以的。2.2.5 文档类型定义回顾一下本章刚开始的那个例子那个HTML网页的第一行是DOCTYPE html。它包含了所谓的文档类型定义Document Type DefinitionDTDDTD会告诉浏览器这个文档所遵循的是哪个版本的HTML标准。HTML在20多年前兴起从那时开始它经历了一些规则的重塑过程如果文档的HTML版本不作明确声明那么规则的变化可能会导致浏览器错误解释。由于DTD在XML中扮演了更关键的角色我们把对这个概念的更详细说明推后到3.3节进行。就现在而言只要知道DTD可以在HTML网页的第一行找到如果有就可以了。一个多种DTD的列表如下所示·HTML 5版·严格的HTML 4.01版2.2.6 空格和换行HTML源代码中的空格和换行不会直接在浏览器显示中转化成空格和换行。所有换行都会被忽略而任何数量的连续空格会被显示为一个空格。如果要强制在文档的解释版本中显示多个间隔我们会使用不间断空格实体 对于多个换行则使用换行标签br。如需更深入了解该主题内容请参阅本书相关材料中的SpacesAndLineBreaks.html。[1] 注意虽然HTML有多个版本而且你可能会碰到某些网站是遵循旧标准的但是我们这里展示的都是符合HTML5规范的文档。不管是哪种版本对数据采集的目的来说它们之间的差异是可以忽略的。2.3 标签和属性HTML有很多合法的标签和属性逐个对它们进行讨论远远超出了本书的范围。实际上我们只会重点介绍一部分在网络数据采集环境中引人注目的标签。注意如果不是另有明确指定下面介绍的所有标签的例子都可以在本书附带材料的TagExample.html中找到。2.3.1 锚标签a锚标签a让HTML网页能链接到其他文档从而把HTML从单纯的标记语言变成超文本标记语言。在浏览器里一个网站到另一个网站的很多导航就是通过锚元素起作用的。我们经常会发现自己需要提取的信息不是位于单个页面而是在一整套页面里。如果我们足够幸运这些页面会在一个索引页面全部列出来。但是更常见的情况是我们必须从一个页面收集指向下一个页面的链接然后从下一个页面找到指向再下一个页面的链接以此类推。在上面两种情况下我们在寻找的信息——另一个页面的位置——都保存在一个a元素中。事实上a元素有更大的灵活性它们不仅可以链接到其他文档还可以链接到一个文档的特定部分。我们可以链接到文档中的锚点使得在网站内的导航更加方便。让我们来看看TagExample.html。目前该HTML网页中最让我们感兴趣的是那些蓝色的带有下划线的文本片段也就是超链接。这里应该会有三个链接一个指向另一个网页另外两个分别指向当前网页的顶部和底部。你可以看看网页的源代码或者下面的列表了解这些功能是如何实现的。·链接到另一个文档2.3.2 元数据标签metameta标签是位于HTML网页的head元素内的一个空标签。meta元素无须闭合这与空元素必须用一个斜杠/闭合的总体规则有所不同。顾名思义meta标签提供了HTML网页的元信息回答了类似如下的问题网页的作者是谁采用了何种编码方案是否有一些关键字用于概括网页的特征网页中用到的语言是什么总体而言在meta元素里会有两个属性。第一个是name或http-equiv第二个永远是content。把name作为第一个属性的meta元素指的是关于文档的信息而带有http-equiv的meta元素则定义了HTTP处理该文档的方式详见第5章。下面是展示meta不同用途的多个例子。要观察一个真实的HTML网页里的meta元素可以再打开TagExample.html。一些常用的meta标签的用途如下所示

更多文章