这个问题已被重新定义.我使用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版本.我该如何检查?