Html 敏捷包,通过站点搜索指定的字符串
Html Agility Pack, search through site for a specified string of words
我正在使用 Html Agility Pack 来完成这项任务,基本上我有一个 URL,我的程序应该通读 html 页面的内容它,如果它找到一行文本(即:"John had three apples"),它应该将标签的文本更改为 "Found it".
我试着用 contains 来做,但我猜它只检查一个词。
var nodeBFT = doc.DocumentNode.SelectNodes("//*[contains(text(), 'John had three apples')]");
if (nodeBFT != null && nodeBFT.Count != 0)
myLabel.Text = "Found it";
编辑:我的其余代码,现在加上 ako 的尝试:
if (CheckIfValidUrl(v)) // foreach var v in a list..., checks if the URL works
{
HtmlWeb hw = new HtmlWeb();
HtmlDocument doc = hw.Load(v);
try
{
if (doc.DocumentNode.InnerHtml.ToString().Contains("string of words"))
{
mylabel.Text = v;
}
...
使用这个:
if (doc.DocumentNode.InnerHtml.ToString().Contains("John had three apples"))
myLabel.Text="Found it";
一个可能的选择是使用 .
而不是 text()
。正如您所怀疑的那样,将 text()
传递给 contains()
函数将仅在搜索的文本是当前元素的第一个直接子元素时才有效:
doc.DocumentNode.SelectNodes("//*[contains(., 'John had three apples')]");
在另一侧,contains(., '...')
评估当前元素的整个文本内容,连接在一起。所以,请注意,上面的 XPath 还将考虑以下元素作为匹配项:
<span>John had <br/>three <strong>apples</strong></span>
如果你需要XPath只考虑整个关键字包含在单个文本节点中的情况,并因此将上述情况视为不匹配,你可以尝试这种方式:
doc.DocumentNode.SelectNodes("//*[text()[contains(., 'John had three apples')]]");
如果上述 none 适合您,请 post 包含关键字但未返回匹配项的最小 HTML 片段,以便我们进一步检查可能导致该行为的原因以及如何修复它。
我正在使用 Html Agility Pack 来完成这项任务,基本上我有一个 URL,我的程序应该通读 html 页面的内容它,如果它找到一行文本(即:"John had three apples"),它应该将标签的文本更改为 "Found it".
我试着用 contains 来做,但我猜它只检查一个词。
var nodeBFT = doc.DocumentNode.SelectNodes("//*[contains(text(), 'John had three apples')]");
if (nodeBFT != null && nodeBFT.Count != 0)
myLabel.Text = "Found it";
编辑:我的其余代码,现在加上 ako 的尝试:
if (CheckIfValidUrl(v)) // foreach var v in a list..., checks if the URL works
{
HtmlWeb hw = new HtmlWeb();
HtmlDocument doc = hw.Load(v);
try
{
if (doc.DocumentNode.InnerHtml.ToString().Contains("string of words"))
{
mylabel.Text = v;
}
...
使用这个:
if (doc.DocumentNode.InnerHtml.ToString().Contains("John had three apples"))
myLabel.Text="Found it";
一个可能的选择是使用 .
而不是 text()
。正如您所怀疑的那样,将 text()
传递给 contains()
函数将仅在搜索的文本是当前元素的第一个直接子元素时才有效:
doc.DocumentNode.SelectNodes("//*[contains(., 'John had three apples')]");
在另一侧,contains(., '...')
评估当前元素的整个文本内容,连接在一起。所以,请注意,上面的 XPath 还将考虑以下元素作为匹配项:
<span>John had <br/>three <strong>apples</strong></span>
如果你需要XPath只考虑整个关键字包含在单个文本节点中的情况,并因此将上述情况视为不匹配,你可以尝试这种方式:
doc.DocumentNode.SelectNodes("//*[text()[contains(., 'John had three apples')]]");
如果上述 none 适合您,请 post 包含关键字但未返回匹配项的最小 HTML 片段,以便我们进一步检查可能导致该行为的原因以及如何修复它。