使用HTMLAgilityPack我试图根据以下结构使用FindElementsByXPath函数生成可点击对象列表。
<div class = "table-container">
<div>
<strong>
<a>Txt<a/>
</strong>
</div>
<Table class="sc" style="display: None;">
</Table>
</div>
问题是,如果表的style-attribute设置为“display:None;”,我只想包含最深层的a-tag。 (请注意,如果表已经展开,则样式属性不存在。)
我正在尝试生成一个可以帮助我实现此目的的XPath表达式。到目前为止,我已经做到了:
//*[@class='table-container' and table[contains(@style,'display: None;')]]/div/strong/a
但是,这不起作用。我试图在线搜索解决方案并尝试各种设置,但到目前为止没有运气。我是XPath选择器的新手,发现自己陷入了困境。任何帮助将不胜感激。
答案 0 :(得分:0)
以下查询应该有效:
//*[@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>
然后返回
<a>Txt</a>
您的查询基本上是正确的。请注意以下内容。
table
可能不匹配,但Table
可能不匹配。<a>Txt<a/>
导致我的解析器被barf。一旦我将其更改为<a>Txt</a>
,就可以了。//div[Table[@style='display: None;']]//a
可以很好地处理测试数据,但可能无法“在现实生活中”工作。例如,如果您实际使用的Xml在display:None
和display: None
之间变化(冒号后面有空格)会导致另一个问题。答案 1 :(得分:0)
我从工作中回来并重新看到它后找到了答案。事实证明,如果你没有点击a-tag中包含的文本,表格根本就不是&#34;那里&#34;就XML而言。只有在你点击它之后,它才会在萤火虫中显现出来,其独特的风格等于&#34;显示:无;&#34;或者是空的。对于我的应用程序,我因此必须检查表是否存在,如果没有,请单击a-tag。最终的XPath是:
//*[@class='table-container' and not(Table)]/div/strong/a
信用确实必须去Ezra指出XPath的细微差别!