如何用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
相关产品推荐
相关产品推荐

