1

我正在尝试使用内置搜索功能中的网站从中收集数据,但无法弄清楚如何按下“搜索”按钮,因为它周围有一些 javascript,并且 id 会随着页面的每次新迭代而变化。

该网站部分的数据如下。

<html>
 <head>
 </head>
 <body>
  <table>
   <tr>
    <td>
    <td>
     <table>
      <tr>
       <td>
        <!-- start of toolbar Main -->
        <table>
         <tr>
          <td>
           <table>
            <tr class="buttonPad">
            </tr>
            <tr>
   *          <td nowrap="true" valign="top" class="button"><a id="S7674" accesskey="S" class="button" title="SEARCH" onclick="dispatch('S7674');"><u>S</u>></td>
            </tr>
           </table>
          </td>
          <td</td>
         </tr>
        </table>
      </td>
      </tr>
     </table>
    </td>
    </td>
   </tr>
  </table>
 </body>
</html>

和我的代码

   my $tree= HTML::TreeBuilder::XPath->new;
      $tree->parse($url);

   my @nodes = $tree->findnodes('/html/body/table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr/td/table.buttonSpace/tbosy/tr/a.button')->get_nodelist; # line is modified later.
   my $nodecount = scalar(@nodes);

   if ($nodecount > 0 ) { print "we found something\n"; }
   else { print "nothing found\n"; } 

   foreach my $node (@nodes)
   {
      print "node is $node\n";
      my $id = $node->findvalue('button');
      print "my id is $id\n";
   }

遗憾的是我的代码没有返回任何节点值。

提前谢谢了。

4

2 回答 2

1

这似乎有效:

use strict;
use warnings;
use HTML::TreeBuilder;
use Data::Dumper;

my $html = <<HTML;
<html>
 <head>
 </head>
 <body>
  <table>
   <tr>
    <td>
    <td>
     <table>
      <tr>
       <td>
        <!-- start of toolbar Main -->
        <table>
         <tr>
          <td>
           <table>
            <tr class="buttonPad">
            </tr>
            <tr>
            <td nowrap="true" valign="top" class="button"><a id="S7674" accesskey="S" class="button" title="SEARCH" onclick="dispatch('S7674');"><u>S</u>></td>
            </tr>
           </table>
          </td>
          <td</td>
         </tr>
        </table>
      </td>
      </tr>
     </table>
    </td>
    </td>
   </tr>
  </table>
 </body>
</html>
HTML

my $tree = HTML::TreeBuilder->new_from_content( $html );
foreach my $atag ( $tree->look_down( _tag => q{a}, 'class' => 'button', 'title' => 'SEARCH' ) ) {
    print Dumper $atag->attr('id');
}
于 2014-01-30T20:35:53.367 回答
0

您也许可以尝试一个更简单的 XPath 查询。您不需要在那里拥有整个层次结构,这太过分了。而且很难做到正确:您的 HTML 不包括tbody您在查询中拥有的内容(也不包括tbosy您也拥有的内容;--)。

如果您识别元素的方式是通过按钮类和标题,请尝试以下操作:

$tree->findnodes( '//td[@class="button"]/a[@class="button" and @title="SEARCH"]')
于 2014-01-31T04:14:59.523 回答