xpath搜索多个关键字

时间:2014-03-31 17:11:45

标签: c# xpath html-agility-pack

我正在使用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')]");是多个关键字的正确方法。

我需要帮助验证这是否是使用多个关键字的正确方法,如果不是,那么我正在寻求帮助来纠正它。

2 个答案:

答案 0 :(得分:1)

这将检索包含字符串'Frozen obamacare'的所有文本节点。它没有标记为单词或任何东西。与您的查询匹配的示例将是:

  • 冷冻obamacare
  • fooFrozen obamacarebar

不匹配:

  • 冷冻foo obamacare
  • ,使用Frozen-奥巴马医改

要匹配包含两个标记的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);
            }
        }
    }
}