13.3.2 提取地区信息的代码

我们下载函数的结果是字符串,因此,需要将字符串解析为 XML 文档。由于这个操作我们将经常要用,所以,要写一个简单的打包函数,用 worldBankDownload 下载数据,以 XDocument 对象的形式返回结果。下载异步运行,因此,我们使用异步工作流实现这个函数:

let worldBankRequest(props) = async {
  let! text = worldBankDownload(props)
  return XDocument.Parse(text) }

代码首先使用 let! 执用异步下载;完成之后,解析 XML 数据,并返回 XDocument 对象。使用 Async.RunSynchronously 进行下载,可以使用上一节的辅助函数,查询返回的 XML 文档。清单 13.9 显示了一个这样的示例,下载了有关国家的汇总信息,然后访问一些值,我们稍后需要。

清单 13.9 浏览地区信息 (F# Interactive)

> let doc =
    worldBankRequest(["countries"], ["region", "NA"])
    |> Async.RunSynchronously;;
val doc : XDocument = (...)

> let c = doc |> xnested ["countries"; "country" ];;    [1]
val c : XElement

> c |> xattr "id";;    [2]
val it : string = "EAP"

> c |> xelem "name" |> xvalue;;    [3]
val it : string = "East Asia & Pacific"

我们首先访问返回文档中的第一个 country 元素,它是根元素 countries 的子元素。遍历 XML 树,我们需要使用 xnested 函数[1],指定要选择元素的路径。

现在,我们可以看一下元素的内容,准备提取哪些信息。首先,我们演示如何获取地区的 ID,它保存在 id 属性中,因此,我们使用 xattr 函数读取[2];我们还需要地区的名字,使显示数据的格式更友好,这个值在 name 元素中。

浏览了结构以后,可以保证我们知道对于一个地区来说,如何访问所有需要的地区信息,然后,再遍历所有地区。清单 13.10 使用相同的函数,但用在序列计算中。

清单 13.10 创建地区信息的序列 (F# Interactive)

> let regions =
    seq { let countries = doc |> xnested [ "rsp"; "countries" ]
            for country in countries |> xelems "country" do    [1]
              yield country |> xelem "name" |> xvalue };;    [2]
val regions : seq<string * string> = seq
[ ("East Asia & Pacific";
("Europe & Central Asia";
("European Monetary Union";
("Heavily indebted poor countries (HIPC)"; ...]

与前面的列表相比,只有一个重要变化,就是现在能够处理数据中的所有 country 节点了。我们使用 xelems 函数[1],访问序列中的元素,用 for 循环进行迭代。因为使用了序列表达式,所以,能够使用 yield 关键字生成结果元素。我们使用了在清单 13.9 中尝试过的部分代码,得到国家的名字,再以序列的形式返回元素[2]。

在本节,我们已经知道如何得到地区信息的列表,作为进一步的研究使用。重要的不是使用的代码,而在于通常和处理过程。创建辅助函数便于数据访问,通过交互方式提取信息,便于了解文档的结构,然后,再把代码打包成函数。下一步,我们将下载需要的指标,比如,地区的森林覆盖情况。

时间: 2024-08-01 20:35:42

13.3.2 提取地区信息的代码的相关文章

Java验证身份证号码及提取生日信息

Java学习第一站,导师给布置的作业题,验证身份证号码的合法性并提取生日信息.第一次写Java代码,第一次用博客记录学习进程,略紧张,对Java变量的命名还停留在C++的命名法阶段,吼吼~~现在开始正题.问题说明:目前,我国大部分地区都使用的是第二代身份证,第二代身份证号码的位数为18位.但公安部没有下发统一的关于停用第一代身份证的文件,第一代身份证中有15位和18位身份证号的混用.15位身份证号码:排列顺序从左至右依次为:6位数字地址码,6位数字出生日期码,3位数字顺序码,其中出生日期码不包含

tika提取pdf信息异常

org.apache.tika.sax.WriteOutContentHandler$WriteLimitReachedException: Your document contained more than 100000 characters, and so your requested limit has been reached. To receive the full text of the document, increase your limit. (Text up to the l

快速获取Windows系统上的国家和地区信息

Windows系统上包含了200多个国家和地区的数据,有时候编程需要这些资料.以下代码可以帮助你快速获取这些信息.将Console语句注释掉,可以更快的完成分析. 1 static void Main(string[] args) { 2 Console.WriteLine("Start!"); 3 // 这里可以修改文件路径和文件名称. 4 var sw = new StreamWriter(new FileStream("RegionInfo.txt", Fil

【BioCode】Elm格式中提取位点信息

说明: ①Elm格式: PLMD ID    Uniprot Accession    Position     Type     Sequence   Species    PMIDsPlMD编号 Uniprot数据库编号         位点 翻译后修饰类型 序列信息 物种 PMID PLMD-1   O00115     52     Ubiquitination  MIPLLLAALLCVPAGALTC Homo sapiens   21963094;23266961 ②代码说明:从上述

python中提取位图信息(AttributeError: module &#39;struct&#39; has no attribute &#39;unstack&#39;)

前言 今天这篇博文有点意思,它是从一个例子出发,从而体现出在编程中的种种细节和一些知识点的运用.和从前一样,我是人,离成神还有几十万里,所以无可避免的出现不严谨的地方甚至错误,请酌情阅读. 0x00 首先,题目是:读取一个位图文件(xxx.bmp),然后读取前30个字节,从这前三十个字节中提取一些信息. 这里有一些知识要先知道:一个位图的前30位有什么? BMP格式采用小端方式存储数据,文件头的结构按顺序如下: 前两个字节:'BM'表示Windows位图,'BA'表示OS/2位图: 一个4字节整

在Scrapy中如何利用Xpath选择器从HTML中提取目标信息(两种方式)

前一阵子我们介绍了如何启动Scrapy项目以及关于Scrapy爬虫的一些小技巧介绍,没来得及上车的小伙伴可以戳这些文章: 手把手教你如何新建scrapy爬虫框架的第一个项目(上) 手把手教你如何新建scrapy爬虫框架的第一个项目(下) 关于Scrapy爬虫项目运行和调试的小技巧(上篇) 关于Scrapy爬虫项目运行和调试的小技巧(下篇) 今天我们将介绍在Scrapy中如何利用Xpath选择器从HTML中提取目标信息.在Scrapy中,其提供了两种数据提取的方式,一种是Xpath选择器,一种是C

城市(地区)行政区划代码

城市(地区)行政区划代码 区划代码 城市名称 区划代码 城市名称 1100 北京市 4202 湖北省黄石市 1100 北京市市辖区 4203 湖北省十堰市 1102 北京市县 4205 湖北省宜昌市 1200 天津市 4206 湖北省襄樊市 1201 天津市市辖区 4207 湖北省鄂州市 1202 天津市县 4208 湖北省荆门市 1300 河北省 4209 湖北省孝感市 1301 河北省石家庄市 4210 湖北省荆州市 1302 河北省唐山市 4211 湖北省黄冈市 1303 河北省秦皇岛市

java 反射提取类信息, 动态代理 和过滤某些方法演示

package org.rui.classts.reflects; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.regex.Pattern; /** * 提取 类的 方法 构造器 * @author lenovo * */ //{args:ShowMethods} //查看一个类的所有方法和构造器 public class ShowMethods { private

用ip来获得用户所在地区信息

淘宝api: package com.ebways.mq.utils; import com.alibaba.fastjson.JSON; import com.ebways.common.utils.StringUtils; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import java.util.Map; /** * Created