如何解析网页

2023-12-02

我试图从 EnviroCanada 天气页面中提取以下内容。

我试图按照以下方式获取每小时的数据。

时间 |大腿|特洛 |湿度

7:00 | 23 | 23 22.9 | 22.9 30

提取的 HTML 页面:

<tr>
         <td headers="header1" class="text-center vertical-center"> 7:00 </td>
        <td headers="header2" class="media vertical-center"><span class="pull-left"><img class="media-object" height="35" width="35" src="/weathericons/small/02.png" /></span><div class="visible-xs visible-sm">
            <br />
            <br />
          </div>
          <div class="media-body">
            <p>Partly Cloudy</p>
          </div>
        </td>
        <td headers="header3m" class=" metricData text-center vertical-center">23
                                            �(22.9)
                                        </td>
        <td headers="header3i" class=" imperialData hidden text-center vertical-center">73
                                            �(73.2)
                                        </td>
        <td headers="header4m" class="metricData text-center vertical-center">
          <abbr title="West-Northwest">WNW</abbr> 8</td>
        <td headers="header4i" class="imperialData hidden text-center vertical-center">
          <abbr title="West-Northwest">WNW</abbr> 5</td>
        <td headers="header6" class="metricData text-center vertical-center">30</td>
        <td headers="header6" class="imperialData hidden text-center vertical-center">87</td>
        <td headers="header7" class="text-center vertical-center">83</td>
        <td headers="header8" class="metricData text-center vertical-center">20</td>
        <td headers="header8" class="imperialData hidden text-center vertical-center">68</td>
        <td headers="header9m" class="metricData text-center vertical-center">100.7</td>
        <td headers="header9i" class="imperialData hidden text-center vertical-center">29.7</td>
        <td headers="header10" class="metricData text-center vertical-center">24</td>
        <td headers="header10" class="imperialData hidden text-center vertical-center">15</td>
      </tr>

到目前为止的代码:

use strict;
use warnings;
use LWP::Simple;
use HTML::TokeParser;


 my $url = "http://weather.gc.ca/past_conditions/index_e.html?station=yyz";
 my $page = get($url) ||
die "Could not load URL\n";


 my $parser = HTML::TokeParser->new(\$page) ||
die "Parse error\n";

 $parser->get_tag("td") foreach ();
 $parser->get_tag("");
 my $time = $parser->get_text();

  ??
 my $thigh = $parser->get_text();


 ???
 my $tlow = $parser->get_text();

 ???
 my $humid = $parser->get_text();

我完全迷失在这里


一旦你获取页面LWP::Simple,您可以根据需要做什么来选择特定的工具,而不是使用通用的解析器。

在这种情况下,您手上有一张桌子,我建议您HTML::表格提取。有了它,您可以通过多种方式干净地检索表元素,然后处理它们。它可以处理多个表、使用标头、设置解析首选项等等。通常您甚至不必查看实际的 HTML。该模块是一个子类HTML::Parser。根据我的经验,这是一个非常好的工具。


以下是针对此特定页面和任务的一些基本代码。

use warnings;
use strict;
use LWP::Simple;
use HTML::TableExtract;

my $url = "http://weather.gc.ca/past_conditions/index_e.html?station=yyz";
my $page = get($url) or die "Can't load $url: $!";

my $headers = [ 'Time', 'Temperature', 'Humidex' ];

my $tec = HTML::TableExtract->new(headers => $headers);
$tec->parse($page);

my $fmt = "%6s | %6s | %6s | %8s\n";    
printf($fmt, 'Time', 'T-high', 'T-low', 'Humidex');    

my ($time, $temp_hi, $temp_low, $hum);

foreach my $rrow ($tec->rows) {
    # Skip rows without expected data. Clean up leading/trailing spaces.
    next if $rrow->[0] !~ /^\s*\d?\d:\d\d/;
    my @row = map { s|^\s*||; s|\s*$||; $_ } @$rrow;
    # Process as needed
    ($time, $hum) = @row[0,2];
    ($temp_hi, $temp_low) = $row[1] =~ /(\d+) .* \( (\d+\.\d+) \)/xs;
    printf($fmt, $time, $temp_hi, $temp_low, $hum);
}

输出的前几行



  Time | T-high |  T-low |  Humidex
 16:00 |     29 |   29.2 |       37
 15:00 |     27 |   27.2 |       37
 14:00 |     26 |   25.6 |       33
...
  

评论。

The headers属性为new使其仅提取这些标题下的列。循环变量是一个参考,到具有行元素的数组。这些元素是单元格中的原始文本。

第一行跳过不具有预期格式的行 - 可能的数字\d?后面跟着另一个数字,然后:然后是两位数。这是为了时间,3:00 or 03:00.

数组引用$rrow被提取到一个数组中@row为了清楚起见。 特定列中寻找的元素,@row[0,2]来时就使用。那个在$row[1]由正则表达式解析,它捕获一个数字(\d+)然后用一个分隔的两个数字.,可能有中间文本(.*)。这些捕获由正则表达式返回,并分配给其他两个变量。

请参阅模块的文档,如果需要,请参阅参考教程佩尔勒夫图特以及正则表达式佩尔雷图特。另一个有用的页面是 Data Structures Cookbookperldsc。其他介绍参见教程。它们通常包含指向更具体文档的链接。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何解析网页 的相关文章

  • 为什么网格项目不居中?

    由于某种原因 两个输入范围使网格中的前两项偏离中心 我假设这是因为它们的影子 DOM 样式 事实真的是这样吗 有谁知道为什么范围使项目 A 和 B 偏离中心 这是一个代码笔 https codepen io tOkyO1 pen QOeKL
  • 从 php 执行 bash 脚本并立即输出回网页

    我有一组 bash 和 Perl 脚本 开发在 Linux Box 上部署所需的目录结构 可选 从svn导出代码 从这个源构建一个包 这在终端上运行良好 现在 我的客户请求此流程的 Web 界面 例如 某些页面上的 创建新包 按钮将一一调用
  • 使用 :hover 作为元素的内联样式(使用 HTML/CSS/php)[重复]

    这个问题在这里已经有答案了 可能的重复 如何将 a hover 规则嵌入到文档中间的样式属性中 https stackoverflow com questions 131653 how do i embed an ahover rule i
  • Text::平衡和多行 xml

    看来我有点失落了 我需要解析一个大的 大约 100 mb 且相当难看的 xml 文件 如果我使用parsefile 它返回错误 文档元素后的垃圾 但它会很乐意解析文件的较小元素 所以我决定将文件分解为元素并解析它们 由于不鼓励使用正则表达式
  • 如何使用 JavaScript 获取元素的填充值?

    我有一个textarea在我的 HTML 中 我需要获取整数或浮点形式的填充数值 以像素为单位 我如何使用 JavaScript 获取它 我没有使用 jQuery 所以我正在寻找纯 JavaScript 解决方案 这将返回padding l
  • AngularJS 在指令运行之前通过 AJAX 检索数据

    我正在使用 AngularUIuiMap http angular ui github com directives map实例化谷歌地图的指令 uiMap 指令非常适合处理硬编码数据 mapOptions and myMarkers 但是
  • 在具有多级分组的 HTML 表格中显示数据

    我必须通过使用 rowspan 进行分组来显示 HTML 表中的一些数据 下面是预期的 GUI 我有如下所示的 JSON 数据 JSON数据here https jsoneditoronline org id 1014438e5489485
  • 对一组复选框使用 HTML5“必需”属性?

    使用支持 HTML5 的较新浏览器 例如 FireFox 4 时 并且表单字段具有属性required required 并且表单字段为空 空白 然后点击提交按钮 浏览器检测到 必填 字段为空 并且不提交表单 相反 浏览器会显示一条提示 要
  • 如何通过单击图像预览上的“x”从文件输入中删除图像?

    我目前有一个文件输入 一旦用户上传图像 就会显示图像预览 在图像预览上 有一个 x 可以从列表中删除图像预览 单击此 x 后 有什么方法可以从输入中的文件集中删除图像吗
  • 如何在HTML中的PHP中注释掉HTML和PHP?

    这是我想注释掉的一行代码 h1 class post title a href title a h1 一种流行的注释方法是分别注释 html 和 php 有一个更好的方法吗
  • 调整文本区域大小

    我需要使用文本区域来显示一些文本 问题是 如果我放置 4 5 行文本 就会出现滚动条 如何使用 CSS HTML 使文本区域与其内容一样大 没有滚动条 文本区域不需要动态更改其大小 我仅使用它来显示文本 我也可以使用禁用的文本区域 我希望文
  • 如何使用 a-href 标签链接回文件夹? [复制]

    这个问题在这里已经有答案了 好吧 我在文件夹中有一个页面 该页面称为 jobs html 该文件夹简称为 jobs 它是我的 网站 文件夹的子文件夹 在 main 文件夹的主目录中是我的 home html 文件 当我尝试做的时候 a hr
  • 防止浮动换行,直到元素达到最小宽度

    我有可变宽度的 HTML 布局 内容左侧有一个固定宽度的菜单 div 可变宽度 由 css max width 和 min width 设置 对于非常窄的浏览器窗口 我希望内容包裹在菜单下方 我目前通过设置来实现这一点float left在
  • 如何使用canvas.toDataURL()将画布保存为图像?

    我目前正在构建一个 HTML5 Web 应用程序 Phonegap 本机应用程序 我似乎不知道如何将画布保存为图像canvas toDataURL 有人可以帮我吗 这是代码 有什么问题吗 我的画布被命名为 canvasSignature J
  • 按百分比设置 bootstrap 模态身高

    我正在尝试制作一个带有主体的模态 当内容变得太大时 该主体会滚动 但是 我希望模式能够响应屏幕尺寸 当我将最大高度设置为 40 时 它没有任何效果 但是 如果我将最大高度设置为 400px 它会按预期工作 但不会响应 我确信我只是错过了一些
  • 如何在 Perl 中使用原始套接字?

    你怎样才能得到一个rawPerl 中的套接字 那么构建与其一起使用的数据包的最佳方法是什么 与在 C 中执行的操作相同 通过在创建套接字时设置套接字类型 在示例中CPAN http search cpan org rgarcia perl
  • 如何将送货地址复制到帐单地址

    我想知道是否可以将送货地址复制到帐单地址 当用户单击与送货地址相同的复选框时 送货地址值将被复制到账单输入字段 我完成了大部分部分 但我不确定如何将选择菜单 状态 值复制到帐单地址 我真的很感谢任何帮助 My code document r
  • 为什么“tbody”不设置表格的背景颜色?

    我在用 tbody 作为 CSS 选择器来设置background color在一个表中 我这样做是因为我有多个 tbody 表内的部分 它们具有不同的背景颜色 我的问题是 当使用border radius在细胞上 细胞不尊重backgro
  • 单击引导分页链接时调用 jquery 函数

    我想在单击引导分页链接时调用 jquery 函数 假设我想从第1页遍历到第2页 应该调用一个jquery函数 我正在使用以下代码 但它不起作用 ul pagination on click li function alert page ch
  • 防止文本区域出现新行

    我正在开发聊天功能 使用 Vue 并使用文本区域作为输入 以便溢出换行 并且对于编写较长消息的用户来说更具可读性 不幸的是 当用户按下 Enter 键并提交时 光标会在提交之前移动到新行 从而使用户体验感觉不佳 关于如何使用普通 Javas

随机推荐

  • 如何查看我的表单当前是否位于其他表单之上?

    基本上 我如何判断我的程序是否位于所有其他程序之上 一个相当简单的方法是 P Invoke获取前景窗口 并比较返回到应用程序的form Handle属性的HWND using System using System Runtime Inte
  • xcode 中阿拉伯字符串反转

    我的 Xcode 有问题 例如我要NSLog 当我写的时候它会显示NSLog 他们是相反的 我要的是阿拉伯语和波斯语 tnx 实际上它是编辑器的问题 所以更改编辑器 就像我在中打开文件一样TextEdit并写了阿拉伯语和波斯语 这对我来说是
  • 某种类型元素的 JS 事件监听器?

    有没有办法为某种类型的 html 元素添加某种监听器 例如 如果我想在用户单击时调用一个函数anyp元素 最简单的答案是使用addEventListener 如果你想要一个特定的 html 标签 就像我想要的那样我的问题那么你会在那里找到答
  • 如何在Hibernate/JPA中为每个持久单元执行differnet import.sql?

    我在 JPA Hibernate 配置中配置了两个持久性单元 现在我需要为每个持久单元执行不同的 import sql 如何指定应为每个持久性单元执行哪个 import sql 根据 Hibernate 的文档 我应该将 import sq
  • HTML5 Boilerplate jQuery 库后备如何工作?

    这是一个关于 html5 样板和 javascript 的初学者问题 但我似乎无法在任何地方找到答案 所以这里是
  • AngularJS:自定义过滤器和 ng-repeat

    我是 AngularJS 新手 我正在构建一个小型概念验证汽车租赁列表应用程序 该应用程序提取一些 JSON 并通过 ng repeat 和几个过滤器呈现该数据的各种位
  • WSO2ESB 是否可以使用标头发送电子邮件

    我希望使用 Header mediator 向我的客户发送电子邮件 是否可以这样做 我的代理是这样的
  • Java:使用unicode上划线显示平方根时字符串的长度?

    在 Java 中 我创建了一个使用 unicode 和上划线的字符串 因为我试图显示数字的平方根 我需要知道某些格式问题的字符串长度 当在 unicode 中使用组合字符时 查找字符串长度的常用方法似乎失败 如以下示例所示 任何人都可以帮我
  • 解包函数返回到 pandas 数据框列

    我有一个现有的数据框 radar locations 其中包含 除其他外 纬度和经度坐标 对于该信息 我需要添加国家 地区和州列 因此我编写了一个函数来执行反向地理编码并返回所需的两个值return geodata state geodat
  • Android 版 Chrome 和桌面版 Chrome 有什么区别?

    我知道两者都使用相同的 webkit 版本 537 36 并且都使用相同的 javascript 引擎 V8 但是它们之间还有其他主要区别吗 我有一个网络应用程序 可以对桌面 Chrome 进行自动测试 但对 Android 上的 Chro
  • Python 中 matplotlib 和 seaborn 之间的绘图不一致

    我正在尝试使用添加错误栏plt errorbar to a pointplot在海博恩 import matplotlib import matplotlib pylab as plt import seaborn as sns impor
  • 用于连接和删除公共前缀的 SQL 查询

    我有一些数据 id ref 1 3536757616 1 3536757617 1 3536757618 并想要得到结果 1 3536757616 7 8 所以本质上数据是在 id 上聚合的 引用连接在一起 用斜杠 分隔 但删除了任何公共前
  • 如何获取 perl 系统调用的 CPU 时间?

    我有一个 perl 脚本 它使用以下命令调用外部可执行文件system 我想测量这些外部程序占用的 CPU 秒数 理想情况下 我想使用内置的 shell 来运行它们time命令 这是在 Linux 系统上 像这样的东西 system tim
  • firebase 云函数 context.auth 字段是否适用于 firestore? [复制]

    这个问题在这里已经有答案了 使用firestore时是否可以通过context auth属性获取触发云功能的用户的uid exports updateReport functions firestore document groups gr
  • PostgreSQL 和 JDBC 的 ClassNotFoundException

    我在与 Java 和 PostgreSQL 数据库建立连接时遇到一些困难 我已经下载了JDBC4 Postgresql 驱动程序 版本 9 2 1002驱动程序并正确设置应用程序 ClassPath 我的代码如下 import java s
  • socket.io 房间或命名空间?

    我正在研究 nodejs socket io 进行实时聊天 我需要一些关于实施房间的建议 使用命名空间或使用房间功能来完全隔离聊天组 哪个更好 房间和命名空间之间真正的技术区别是什么 资源使用情况有区别吗 这就是命名空间和房间所具有的共同点
  • 强制 CMake 查找 x64 位库而不是 x32

    因此 我一直在 stackoverflow 和其他一些论坛中查找如何强制 CMake 查找 x64 库而不是 x32 但它并没有多大帮助 当我做 find package Boost 1 67 0 COMPONENTS atomic REQ
  • 如何在 macOS 终端中批量重命名文件?

    我有一个包含一系列文件的文件夹 名为 prefix 1234 567 png prefix abcd efg png 我想批量删除一个下划线和中间内容 因此输出将是 prefix 567 png prefix efg png 相关但不完全解
  • 我可以将 Zend PDT (eclipse) 链接到浏览器操作吗?

    是否可以在 Eclipse 中配置 Zend PDT 调试器 以与 Eclipse 的 Java 调试器类似的方式从浏览器操作中命中断点 IE 设置断点 启动调试器 浏览站点 然后在遇到断点时进入断点 我可以调试单个脚本和网页 但是我正在尝
  • 如何解析网页

    我试图从 EnviroCanada 天气页面中提取以下内容 我试图按照以下方式获取每小时的数据 时间 大腿 特洛 湿度 7 00 23 23 22 9 22 9 30 提取的 HTML 页面 tr td class text center