栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么我的XPath查询(抓取HTML表)只能在Firebug中工作,而不能在我正在开发的应用程序中工作?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么我的XPath查询(抓取HTML表)只能在Firebug中工作,而不能在我正在开发的应用程序中工作?

问题:DOM需要
<tbody/>
标签

Firebug,Chrome的开发人员工具,Javascript中的XPath函数以及其他功能都可以在 DOM上运行 ,而不是基本的
HTML源代码

HTML的DOM要求表主体标签中包含页脚(

<thead/>
<tfoot/>
)的表头中未包含的所有表行
<tbody/>
。因此,如果解析(X)HTML时缺少该标记,浏览器将添加该标记。

tbody
即使表未显式定义
tbody
元素,该元素也会显示给所有表。

另一方面,HTML不一定要求使用该标记:

TBODY
开始标签总是需要当表包含只有一个表的身体和没有表头或脚的部分除外。

大多数XPath处理器都可以在原始XML上运行

除Javascript外,大多数XPath处理器都在原始XML(而不是DOM)上工作,因此不添加

<tbody/>
标签。另外,HTML解析器库(例如tag-soup”显示标记为“ tag-soup”的问题”)和htmltidy仅输出XHTML,而不输出“ DOM-HTML”。

这是在Stackoverflow上发布的常见问题,适用于PHP,Ruby,Python,Java,C#,GoogleDocs(电子表格)以及许多其他问题。
Selenium在浏览器中运行并在DOM上运行-因此不受影响!

重现问题

将Firebug(或Chrome的开发工具)显示的源与通过右键单击并选择“显示页面源”(或在浏览器中调用的名称)或

curlhttp://your.example.org
在命令行上使用的源进行比较。后期可能不会包含任何
<tbody/>
元素(很少使用),Firebug将始终显示它们。


解决方案1:删除
/tbody
轴步

检查您所停留的表是否确实不包含

<tbody/>
元素(请参阅最后一段)。如果是这样,您可能还会遇到另一种问题。

现在删除

/tbody
轴步,这样您的查询将类似于

//table[@id="example"]/tr[2]/td[1]

解决方案2:跳过
<tbody/>
标签

这是一个很脏的解决方案,对于嵌套表可能会失败(可以跳入内部表)。我只会在极少数情况下建议这样做。

/tbody
后代或自身步骤替换轴步骤:

//table[@id="example"]//tr[2]/td[1]

解决方案3:允许输入带
<tbody/>
标签和不带标签

如果您不确定事先确定您的表或在“HTML源”和DOM上下文中都使用查询,请执行以下操作:并且不希望/不能使用解决方案2中的技巧,请提供替代查询(针对XPath1.0)或使用“可选的”轴步(XPath 2.0及更高版本)。

  • XPath 1.0

    //table[@id="example"]/tr[2]/td[1] |//table[@id="example"]/tbody/tr[2]/td[1]

  • XPath 2.0

    //table[@id="example"]/(tbody, .)/tr[2]/td[1]



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/432493.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号