加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

带有条件的Perl XPath语句 – 可能吗?

发布时间:2020-12-16 06:18:34 所属栏目:大数据 来源:网络整理
导读:这个问题已被重新定义.我使用CPAN Perl模块 WWW::Mechanize来浏览网站,使用 HTML::TreeBuilder-XPath来捕获内容,使用 xacobeo来测试我的HTML / XML上的XPath代码.目标是从基于PHP的网站调用此Perl脚本,并将已删除的内容上载到数据库中.因此,如果内容“缺失”
这个问题已被重新定义.我使用CPAN Perl模块 WWW::Mechanize来浏览网站,使用 HTML::TreeBuilder-XPath来捕获内容,使用 xacobeo来测试我的HTML / XML上的XPath代码.目标是从基于PHP的网站调用此Perl脚本,并将已删除的内容上载到数据库中.因此,如果内容“缺失”,仍然需要考虑.

下面是一个经过测试的简化示例代码,描述了我的挑战.注意:

>此页面是动态填充的,包含为不同商店输出的各种ITEMS;每个商店将存在不同数量的产品*.这些产品清单可能有也可能没有下面的逐项表.
>捕获的数据必须在数组中,并且必须维护任何逐项列表(如果存在)与产品列表的关联.

下面,示例xml每个商店更改(如上所述),但为了简洁起见,我只显示一个“类型”的输出.我意识到所有数据都可以捕获到一个数组中,然后使用正则表达式来解密内容,以便将其上传到数据库中.我正在寻求更好的XPath知识,以帮助简化此(和未来)解决方案.

<!DOCTYPE XHTML>
<table id="8jd9c_ITEMS">
<tr><th style="color:red">The Products we have in stock!</th></tr>

<tr><td><span id="Product_NUTS">We have nuts!</span></td></tr>
<tr><td>
    <!--Table may or may not exist  -->
           <table>                                  
      <tr><td style="color:blue;text-indent:10px">Almonds</td></tr>
      <tr><td style="color:blue;text-indent:10px">Cashews</td></tr>
      <tr></tr>
    </table>
</td></tr>

<tr><td><span id="Product_VEGGIES">We have veggies!</span></td></tr>
<tr><td>
    <!--Table may or may not exist -->
    <table>
      <tr><td style="color:blue;text-indent:10px">Carrots</td></tr>
      <tr><td style="color:blue;text-indent:10px">Celery</td></tr>
      <tr></tr>
    </table>
</td></tr>

<tr><td><span id="Product_ALCOHOL">We have booze!</span></td></tr>
    <!--In this case,the table does not exist -->
</table>

XPath语句:

'//table[contains(@id,"ITEMS")]/tr[position() >1]/td/span/text()'

会发现:

We have nuts!
we have veggies!
We have booze!

和XPath声明:

'//table[contains(@id,"ITEMS")]/tr[position() >1]/td/table/tr/td/text()'

会发现:

Almonds
Cashews
Carrots
Celery

可以组合两个XPath语句:

'//table[contains(@id,"ITEMS")]/tr[position() >1]/td/span/text() | //table[contains(@id,"ITEMS")]/tr[position() >1]/table/tr/td/text()'

找到:

We have nuts!
Almonds
Cashews
We have veggies!
Carrots
Celery
We have booze!

同样,上面的数组可以使用正则表达式对其产品到列表关联进行解密(在实际代码中).但是,可以使用XPath以保持该关联的方式构建阵列吗?

例如(伪说话,这不起作用):

'//table[contains(@id,"ITEMS")]/tr[position()>1]/td/span/text() | 
if exists('//table[contains(@id,"ITEMS")]/tr[position() >1]/table)) 
then ("NoTable") else ("TableRef") | 
Save this result into @TableRef ('//table[contains(@id,"ITEMS")]/tr[position() >1]/table/tr/td/text()')'

在Perl中构建多维数组(在传统意义上)是不可能的,参见perldoc perlref但是希望类似于上面的解决方案可以创建类似的东西:

@ITEMS[0] => We have nuts!
@ITEMS[1] => nutsREF     <-- say,the last word of the span value + REF
@ITEMS[2] => We have veggies!
@ITEMS[3] => veggiesREF  <-- say,the last word of the span value + REF
@ITEMS[4] => We have booze!
@ITEMS[5] => NoTable     <-- value accounts for the missing info

@nutsREF[0] => Almonds
@nutsREF[1] => Cashews

@veggiesREF[0] => Carrots
@veggiesREF[1] => Celery

在实际代码中,产品是已知的,因此我的@veggiesREF和我的@nutsREF可以在预期XPath输出时定义.

我意识到XPath if / else / then功能是在XPath 2.0版本中.我在ubuntu系统上并在本地工作,但我仍然不清楚我的apache2服务器是使用它还是1.0版本.我该如何检查?

最后,如果您可以展示如何从PHP表单提交调用Perl脚本以及如何将Perl数组传递回调用PHP函数,那么这将获得赏金.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读