【问题标题】:Using HTMLAgilityPack Extract text, which is not between tags and comes after specific node使用 HTMLAgilityPack 提取文本,它不在标签之间,在特定节点之后
【发布时间】:2013-05-10 07:18:37
【问题描述】:

HTML 代码:

 <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;
        }

我设法得到的: 汽车

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

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

提前致谢。 PS.我想避免使用正则表达式..

【问题讨论】:

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


    【解决方案1】:

    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.
    

    【讨论】:

    • 谢谢西蒙。如果描述不包含“汽车”一词,则会出现问题。如果被描述了怎么办。 “四个轮子上的东西”。我已经用 /following::text()[1] 解决了这个问题,所以代码会在节点之后抓取 CAR 和文本。 HtmlNode 链接 = doc.DocumentNode.SelectSingleNode(".//b[contains(text(), 'CAR')]/following::text()[1]");
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 2016-09-10
    • 2018-09-25
    相关资源
    最近更新 更多