Html Agility Pack,在网站上搜索指定的字符串

c# html-agility-pack

我正在使用Html Agility Pack完成这项任务,基本上我有一个URL,我的程序应该读取它上面的html页面的内容,如果它找到一行文本(即:“John有三个苹果“),它应该将标签的文本更改为”找到它“。

我试着用contains来做,但我想它只检查一个单词。

var nodeBFT = doc.DocumentNode.SelectNodes("//*[contains(text(), 'John had three apples')]");

if (nodeBFT != null && nodeBFT.Count != 0)
    myLabel.Text = "Found it";

编辑:我的其余代码,现在与ako的尝试:

var nodeBFT = doc.DocumentNode.SelectNodes("//*[contains(text(), 'John had three apples')]");

if (nodeBFT != null && nodeBFT.Count != 0)
    myLabel.Text = "Found it";

一般承认的答案

一种可能的选择是使用.而不是text() 。如您所怀疑的那样,将text()传递给contains()函数,只有当搜索到的文本是当前元素的第一个直接子元素时才会有效:

doc.DocumentNode.SelectNodes("//*[contains(., 'John had three apples')]");

在另一方面, contains(., '...')评估当前元素的整个文本内容,连接。所以,只是抬头,上面的XPath也会考虑以下元素作为匹配:

doc.DocumentNode.SelectNodes("//*[contains(., 'John had three apples')]");

如果您需要XPath仅考虑整个关键字包含在单个文本节点中的情况,并因此将上述情况视为不匹配,则可以尝试这种方式:

doc.DocumentNode.SelectNodes("//*[contains(., 'John had three apples')]");

如果以上都不适合您,请发布包含关键字的最小HTML片段,但不返回任何匹配项,因此我们可以进一步检查可能导致该行为的原因以及解决方法。


热门答案

用这个:

if (doc.DocumentNode.InnerHtml.ToString().Contains("John had three apples"))
    myLabel.Text="Found it";



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因