使用HTMLAgilityPack提取文本,该文本不在标记之间,而是在特定节点之后

时间:2013-05-10 07:18:37

标签: c# html xpath web-scraping html-agility-pack

HTML code:

 <b> CAR </b>
    <br></br>
  Car is something you can drive.
    <br></br>
    <br></br>

C#代码:

        HtmlAgilityPack.HtmlDocument doc = new HtmlWeb().Load("http://website.com/x.html");

        if (doc != null)
        {
            HtmlNode link = doc.DocumentNode.SelectSingleNode("//b[contains(text(), 'CAR')]");

            webBrowser1.DocumentText = link.InnerText;
            webBrowser1.AllowNavigation = true;

            webBrowser1.ScriptErrorsSuppressed = true;
            webBrowser1.Visible = true;
        }

我得到了什么: CAR

我需要得到:
CAR 汽车是你可以驾驶的东西。

有什么建议吗? 我尝试添加下一个节点,但我给了NullReferenceExceptions: “// b [contains(text(),'CAR')/ br]”和“// b [contains(text(),'CAR')/ br / br]”

提前致谢。 PS.I我想避开Regex ..

1 个答案:

答案 0 :(得分:0)

XPATH区分大小写(有关详细信息,请参阅此处:Is it possible to ignore case using xpath and c#?)加上包含'Car'的第二个短语不是子元素B元素。你可以让它像这样工作:

HtmlDocument doc = new HtmlWeb().Load("http://website.com/x.html");
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//text()[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'car')]"))
{
    Console.WriteLine(node.InnerText);
}

在控制台应用程序中,它将输出:

 CAR

  Car is something you can drive.