【问题标题】:perl Find varying element id using HTML::Treebuilderperl 使用 HTML::Treebuilder 查找不同的元素 id
【发布时间】:2014-01-31 12:14:59
【问题描述】:

我正在尝试使用内置搜索功能中的网站从中收集数据,但无法弄清楚如何按下“搜索”按钮,因为它周围有一些 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";
   }

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

非常感谢。

微型

【问题讨论】:

    标签: javascript perl xpath html-treebuilder


    【解决方案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');
    }
    

    【讨论】:

    • 谢谢老兄,这似乎在这个 HTML 数据上工作得很好,但当我在网站本身上尝试时却不行。 (注意,我为这篇文章调整了很多数据)在运行之前我应该​​对 url 数据做些什么吗?
    • 我如何将“id”分配给一个变量,以便我稍后将其作为按钮单击来调用?
    • 发布未更改的 html。您可能会发现这样的东西更容易用于您的目的:pypi.python.org/pypi/selenium
    • 你能给我一个帖子的例子吗?我对python的经验很少,所以我怀疑它会更痛苦。
    • 该页面上的示例是一个很好的起点。 from selenium import webdriver from selenium.webdriver.common.keys import Keys browser = webdriver.Firefox() browser.get('http://www.yahoo.com') assert 'Yahoo!' in browser.title elem = browser.find_element_by_name('p') # Find the search box elem.send_keys('seleniumhq' + Keys.RETURN) browser.quit()
    【解决方案2】:

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

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

    $tree->findnodes( '//td[@class="button"]/a[@class="button" and @title="SEARCH"]')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-11
      • 2012-01-23
      • 1970-01-01
      • 2011-01-18
      • 2012-07-14
      相关资源
      最近更新 更多