根据其他 child 选择 children of parent
Selecting children of parent, based on other child
我正在尝试使用 HTMLAgilityPack 生成可点击列表 objects,使用函数 FindElementsByXPath,基于以下结构。
<div class = "table-container">
<div>
<strong>
<a>Txt<a/>
</strong>
</div>
<Table class="sc" style="display: None;">
</Table>
</div>
但是问题是,如果 table 的 style-attribute 设置为 "display: None;",我只想包含 deepest-level a-tag(请注意如果 table 已经展开,则样式属性不存在)。
我正在尝试生成一个 XPath 表达式来帮助我实现此目的。到目前为止,我已经做到了:
//*[@class='table-container' and table[contains(@style,'display: None;')]]/div/strong/a
但是,这不起作用。我尝试在线搜索解决方案并尝试各种设置,但到目前为止运气不佳。我是 XPath 选择器的新手,发现自己卡在了这一刻。任何帮助将不胜感激。
解决方案
以下查询应该有效:
//*[@class='table-container' and Table[contains(@style,'display: None;')]]/div/strong/a
这与您所拥有的非常接近。
测试
我在以下 Xml 上测试了它:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<div class="table-container">
<div>
<strong>
<a>Txt</a>
</strong>
</div>
<Table class="sc" style="display: None;"/>
</div>
<div class="table-container">
<div>
<strong>
<a>Txt2</a>
</strong>
</div>
<Table class="sc"/>
</div>
</root>
它returns
<a>Txt</a>
备注
您的查询基本正确。请注意以下事项。
- Xml 解析器可能真的很挑剔。检查选择器中项目的大小写。例如,
table
可能不匹配,但 Table
可能匹配。
- Xml 解析器可能真的很脆弱。检查您尝试解析的标记是否有效。在发布的片段中,我们有
<a>Txt<a/>
导致我的解析器呕吐。一旦我将其更改为 <a>Txt</a>
就可以了。
- 做同一件事往往有很多不同的方法。最合适的将在很大程度上取决于您实际的结构Xml。例如,
//div[Table[@style='display: None;']]//a
在测试数据上运行良好,但“在现实生活中”可能不起作用。例如,如果您实际使用的 Xml 在 display:None
和 display: None
之间变化(冒号后有 space),这会导致另一个问题。
下班回来重新看的时候找到了答案。事实证明,如果您没有单击 a 标签中包含的文本,就 XML 而言,table 根本就不是 "there"。只有在您单击它之后,它才会在 firebug 中可见,并且区分样式等于 "display: None;" 或为空。因此,对于我的应用程序,我必须检查 table 是否存在,如果不存在,请单击 a-tag。最终的 XPath 是:
//*[@class='table-container' and not(Table)]/div/strong/a
Ezra 指出了 XPath 的细微差别,这一定要归功于他!
我正在尝试使用 HTMLAgilityPack 生成可点击列表 objects,使用函数 FindElementsByXPath,基于以下结构。
<div class = "table-container">
<div>
<strong>
<a>Txt<a/>
</strong>
</div>
<Table class="sc" style="display: None;">
</Table>
</div>
但是问题是,如果 table 的 style-attribute 设置为 "display: None;",我只想包含 deepest-level a-tag(请注意如果 table 已经展开,则样式属性不存在)。
我正在尝试生成一个 XPath 表达式来帮助我实现此目的。到目前为止,我已经做到了:
//*[@class='table-container' and table[contains(@style,'display: None;')]]/div/strong/a
但是,这不起作用。我尝试在线搜索解决方案并尝试各种设置,但到目前为止运气不佳。我是 XPath 选择器的新手,发现自己卡在了这一刻。任何帮助将不胜感激。
解决方案
以下查询应该有效:
//*[@class='table-container' and Table[contains(@style,'display: None;')]]/div/strong/a
这与您所拥有的非常接近。
测试
我在以下 Xml 上测试了它:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<div class="table-container">
<div>
<strong>
<a>Txt</a>
</strong>
</div>
<Table class="sc" style="display: None;"/>
</div>
<div class="table-container">
<div>
<strong>
<a>Txt2</a>
</strong>
</div>
<Table class="sc"/>
</div>
</root>
它returns
<a>Txt</a>
备注
您的查询基本正确。请注意以下事项。
- Xml 解析器可能真的很挑剔。检查选择器中项目的大小写。例如,
table
可能不匹配,但Table
可能匹配。 - Xml 解析器可能真的很脆弱。检查您尝试解析的标记是否有效。在发布的片段中,我们有
<a>Txt<a/>
导致我的解析器呕吐。一旦我将其更改为<a>Txt</a>
就可以了。 - 做同一件事往往有很多不同的方法。最合适的将在很大程度上取决于您实际的结构Xml。例如,
//div[Table[@style='display: None;']]//a
在测试数据上运行良好,但“在现实生活中”可能不起作用。例如,如果您实际使用的 Xml 在display:None
和display: None
之间变化(冒号后有 space),这会导致另一个问题。
下班回来重新看的时候找到了答案。事实证明,如果您没有单击 a 标签中包含的文本,就 XML 而言,table 根本就不是 "there"。只有在您单击它之后,它才会在 firebug 中可见,并且区分样式等于 "display: None;" 或为空。因此,对于我的应用程序,我必须检查 table 是否存在,如果不存在,请单击 a-tag。最终的 XPath 是:
//*[@class='table-container' and not(Table)]/div/strong/a
Ezra 指出了 XPath 的细微差别,这一定要归功于他!