You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Mojo::DOM解析表格提取指定列至数组?

使用Mojo::DOM解析表格提取指定列数据

没问题,我来帮你搞定这个表格解析的需求!Mojo::DOM处理HTML表格非常灵活,下面是具体的实现步骤和代码示例,完全贴合你的需求:

第一步:整理待解析的HTML表格

首先把你提供的表格代码整理成标准HTML格式(去掉多余的#标记):

<table class="table table-hover">
  <thead>
    <th>Username</th>
    <th>Tip</th>
    <th>Last login</th>
    <th>No. comments</th>
  </thead>
  <tr>
    <td><a href="/user/user8">user8</a></td>
    <td>level2</td>
    <td class="dateTime">2019-09-26 00:00:00</td>
    <td>0</td>
  </tr>
  <tr>
    <td><a href="/user/user9">user9</a></td>
    <td>level2</td>
    <td class="dateTime">2019-09-26 00:00:00</td>
    <td>0</td>
  </tr>
  <tr>
    <td><a href="/user/user11">user11</a></td>
    <td>level2</td>
    <td class="dateTime">2019-09-26 00:00:00</td>
    <td>0</td>
  </tr>
  <tr>
    <td><a href="/user/user1">user1</a></td>
    <td>level1</td>
    <td class="dateTime">2020-02-28 10:43:09</td>
    <td>23</td>
  </tr>
  <tr>
    <td><a href="/user/user2">user2</a></td>
    <td>level1</td>
    <td class="dateTime">2020-02-28 10:43:10</td>
    <td>2</td>
  </tr>
  <tr>
    <td><a href="/user/user3">user3</a></td>
    <td>level1</td>
    <td class="dateTime">2020-02-28 10:43:10</td>
    <td>3</td>
  </tr>
  <tr>
    <td><a href="/user/user4">user4</a></td>
    <td>level1</td>
    <td class="dateTime">2020-02-28 10:43:11</td>
    <td>4</td>
  </tr>
  <tr>
    <td><a href="/user/user5">user5</a></td>
    <td>level1</td>
    <td class="dateTime">2020-02-28 10:43:11</td>
    <td>5</td>
  </tr>
</table>

第二步:编写Mojo::DOM解析代码

下面是完整的Perl代码,会把Username和No. comments列的数据分别提取到两个数组中:

use Mojo::DOM;

# 假设你的HTML内容存在这个变量里(也可以从文件/URL加载)
my $html = <<'HTML';
<table class="table table-hover">
  <thead>
    <th>Username</th>
    <th>Tip</th>
    <th>Last login</th>
    <th>No. comments</th>
  </thead>
  <tr>
    <td><a href="/user/user8">user8</a></td>
    <td>level2</td>
    <td class="dateTime">2019-09-26 00:00:00</td>
    <td>0</td>
  </tr>
  <tr>
    <td><a href="/user/user9">user9</a></td>
    <td>level2</td>
    <td class="dateTime">2019-09-26 00:00:00</td>
    <td>0</td>
  </tr>
  <tr>
    <td><a href="/user/user11">user11</a></td>
    <td>level2</td>
    <td class="dateTime">2019-09-26 00:00:00</td>
    <td>0</td>
  </tr>
  <tr>
    <td><a href="/user/user1">user1</a></td>
    <td>level1</td>
    <td class="dateTime">2020-02-28 10:43:09</td>
    <td>23</td>
  </tr>
  <tr>
    <td><a href="/user/user2">user2</a></td>
    <td>level1</td>
    <td class="dateTime">2020-02-28 10:43:10</td>
    <td>2</td>
  </tr>
  <tr>
    <td><a href="/user/user3">user3</a></td>
    <td>level1</td>
    <td class="dateTime">2020-02-28 10:43:10</td>
    <td>3</td>
  </tr>
  <tr>
    <td><a href="/user/user4">user4</a></td>
    <td>level1</td>
    <td class="dateTime">2020-02-28 10:43:11</td>
    <td>4</td>
  </tr>
  <tr>
    <td><a href="/user/user5">user5</a></td>
    <td>level1</td>
    <td class="dateTime">2020-02-28 10:43:11</td>
    <td>5</td>
  </tr>
</table>
HTML

# 初始化DOM解析器
my $dom = Mojo::DOM->new($html);

# 初始化两个空数组
my @usernames;
my @comment_counts;

# 遍历表格的每一行(跳过thead里的行,只处理tbody的tr)
$dom->find('tr')->each(sub {
  my $tr = shift;
  # 获取当前行的所有td元素
  my @tds = $tr->find('td')->each;
  # 只有当td数量符合时才处理(避免thead的行干扰)
  if (@tds == 4) {
    # 第一个td里的a标签文本就是Username
    push @usernames, $tds[0]->text;
    # 第四个td的文本是评论数,也可以转成整数:int($tds[3]->text)
    push @comment_counts, $tds[3]->text;
  }
});

# 测试输出结果
print "Usernames: @usernames\n";
print "Comment counts: @comment_counts\n";

代码解释

  • Mojo::DOM->new($html):把HTML字符串转换成DOM对象,方便后续查询
  • $dom->find('tr')->each(...):遍历所有元素
  • @tds = $tr->find('td')->each:提取当前行的所有单元格
  • 判断@tds ==4是为了跳过表头行(表头里是不是,所以不会被匹配到,不过加个判断更稳妥)
  • $tds[0]->text:获取第一个单元格里的文本(也就是用户名链接的文本)
  • $tds[3]->text:获取第四个单元格的文本(评论数)

额外提示

  • 如果你的HTML是从网页上获取的,可以直接用Mojo::UserAgent加载页面,然后获取DOM,比如:
    use Mojo::UserAgent;
    my $ua = Mojo::UserAgent->new;
    my $dom = $ua->get('https://your-url.com')->res->dom;
    
  • 如果需要把评论数转成整数,只需要把push @comment_counts, $tds[3]->text;改成push @comment_counts, int($tds[3]->text);就行

内容的提问来源于stack exchange,提问作者Samoila Andrei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 19:32:38