c#htmlagilitypack - 如何从网页中提取特定文本

时间:2017-06-19 15:37:11

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

我正试图从中提取描述 http://www.wowhead.com/quest=35151/your-base-your-choice
并将其显示为richTextBox控件。

输出应为:

  

你已经在霜火中建造了一个令人印象深刻的驻军。一世   相信我应该推迟下一个选择。 Gorgrond的一个地区   资源丰富。木材厂可以帮助我们充分利用   他们。另一个地区拥有硬化的角斗士。对战竞技场   会帮助说服他们为我们的事业而战。两条道路都会   在我们寻找和削弱钢铁部落时强化我们。哪个呢   你选择了,指挥官?

以下是我到目前为止尝试过的代码。

HtmlAgilityPack.HtmlDocument html = new HtmlAgilityPack.HtmlDocument();
            html.LoadHtml(new WebClient().DownloadString("http://www.wowhead.com/quest=35151"));            
            var root = html.DocumentNode;
            var p = root.Descendants("h2")
                .Where(n => n.GetAttributeValue("class", "")
                .Equals("heading-size-3"))
                .FirstOrDefault().NextSibling;
            richTextBox1.Text = p.InnerText;

但我得到的只是:

  

你已经在霜火中建造了一个令人印象深刻的驻军。一世   相信我应该推迟下一个选择。

我为我的英语道歉。

1 个答案:

答案 0 :(得分:0)

你需要在第一个.heading-size-3之间循环遍历所有兄弟姐妹,直到下一个标题.heading-size-3

HtmlAgilityPack.HtmlDocument html = new HtmlAgilityPack.HtmlDocument();
html.LoadHtml(new WebClient().DownloadString("http://www.wowhead.com/quest=35151"));
var root = html.DocumentNode;
var descriptionHeader = root.Descendants("h2")
    .Where(n => n.GetAttributeValue("class", "")
    .Equals("heading-size-3"))
    .FirstOrDefault();
var current = descriptionHeader.NextSibling;
var result = "";
while(current != null && !current.GetAttributeValue("class", "")
    .Equals("heading-size-3"))
{
    if (!string.IsNullOrEmpty(current.InnerText))
    {
        result += " "+current.InnerText;
    }
    current = current.NextSibling;
}
richTextBox1.Text = result;

最后,您将收到:

  

你已经在霜火中建造了一个令人印象深刻的驻军。我相信我应该推迟下一个选择。   Gorgrond的一个地区资源丰富。木材厂可以帮助我们充分利用它们。   另一个地区拥有硬化的角斗士。争吵竞技场将有助于说服他们为我们的事业而战。   当我们寻找并削弱钢铁部落时,任何一条道路都会加强我们。   你选择哪个,指挥官?