我正在使用htmlagilitypack和xpath来抓取特定关键字的网页。我一次在搜索多个关键字时遇到了麻烦。
所以我为关键字填充的代码是(随机选择的关键字:Frozen和obamacare):
HtmlDocument doc = new HtmlDocument();
HtmlWeb web = new HtmlWeb();
doc = web.Load(uri);
HtmlNodeCollection Nodes = doc.DocumentNode.SelectNodes("//text()[contains(., 'Frozen obamacare')]");
虽然我知道该页面特别包含两个关键字,但这并不起作用,而且其他调查结果基本上告知SelectNodes("//text()[contains(., 'Frozen obamacare')]");
是多个关键字的正确方法。
我需要帮助验证这是否是使用多个关键字的正确方法,如果不是,那么我正在寻求帮助来纠正它。
答案 0 :(得分:1)
这将检索包含字符串'Frozen obamacare'的所有文本节点。它没有标记为单词或任何东西。与您的查询匹配的示例将是:
不匹配:
要匹配包含两个标记的XPath 1.0中的字符串,请使用
//text()[contains(., 'Frozen') and contains(., 'obamacare')]
HTML Agility Pack仅支持XPath 1.0,因此您无法使用XPath 2.0的更高级标记化功能。
答案 1 :(得分:1)
您的XPath //text()[contains(., 'Frozen obamacare')]
从字面上检查包含字符串Frozen obamacare
的文本节点。
您可能想要检查是否可以使用XPath 2.0或XQuery 1.0,因为您可以使用例如//text()[matches(., 'Frozen|obamacare')]
或考虑使用.NET和HTML Agility Pack中的LINQ支持,并使用正则表达式支持
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using HtmlAgilityPack;
namespace ConsoleApplication63
{
class Program
{
static void Main(string[] args)
{
HtmlWeb web = new HtmlWeb();
HtmlDocument doc = web.Load("http://stackoverflow.com/questions/22767900/xpath-search-for-multiple-keywords");
foreach (HtmlTextNode text in doc.DocumentNode.Descendants().OfType<HtmlTextNode>().Where(n => Regex.IsMatch(n.InnerText, @"\b(Frozen|obamacare)\b")))
{
Console.WriteLine("Found \"{0}\"", text.InnerText);
}
}
}
}