0

我试图使用 HTML::TreeBuilder 解析一些网页的内容,然后进行类似 XPath 的手动遍历。

但我得到了一些非常奇怪的东西。

这是 Chrome 的开发者工具从网页生成的 X-Path:

/html/body/table/tbody/tr/td[1]/table[3]/tbody/tr[1]/td[2]/
table[1]/tbody/tr[1]/td[2]/**table[9]** 

最后一个内部表#9 是我需要的——更具体地说,是一个包含“点击查看”文本的单元格。

这是开发人员工具的屏幕截图 - 请注意 BODY 标签下只有一个表格:

在此处输入图像描述

如果您深入了解该 XPath,您将看到我寻找的元素(请注意,它实际上是表内表中的嵌套表 - 我包括了我寻找的 TD 元素):

在此处输入图像描述




但是,这就是 HTML::TreeBuilder 生成的(基本上,一个<body>包含 22 个标签的标签,其中大部分是<table>标签:

  DB<16>  x $tree->tag
0  'body'

  DB<17>  x map {$_->tag} $tree->content_list
0  'table'
1  'table'
2  'table'
3  'table'
4  'table'
5  'table'
6  'table'
7  'table'
8  'table'
9  'table'
10  'table'
11  'table'
12  'table'
13  'table'
14  'table'
15  'table'
16  'table'
17  'table'
18  'table'
19  'script'
20  'table'
21  'table'

如您所见,BODY TAG 下的第 8 个表包含我想要的元素

  DB<37> foreach my $c (0 .. $tree->content_list-1) { 
           if (($tree->content_list)[$c]->as_HTML =~ /click to view/)
              {print $c+1}}
9
4

1 回答 1

0

您正在处理的页面很可能包含无效的 HTML。在这种情况下,如何实际呈现该内容是开放的季节,不同的软件将做出不同的选择。

恐怕除了在没有解析器帮助的情况下处理 HTML 或者在您通过HTML::TreeBuilder. 这些都不是一个非常令人愉快的前景。

于 2013-11-24T02:54:13.327 回答