2016-01-23 4 views
0

Я пытаюсь очистить веб-сайт, чтобы получить данные от него. До сих пор я получил его, по крайней мере подключиться к веб-сайт, но теперь, когда я пытаюсь установить текст текстового поля с данными, я просто получаю кучу:HtmlAgilityPack XPath return HtmlAgilityPack.HtmlNodeCollection

HtmlAgilityPack.HtmlNodeCollection 

Есть такое же количество HtmlAgilityPack.HtmlNodeCollection как есть данные. Вот мой код (я немного неаккуратно знаю):

using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Text.RegularExpressions; 
using System.Windows.Forms; 
using System; 
using HtmlAgilityPack; 

namespace WindowsFormsApplication1 
{ 
public partial class Form1 : Form 
{ 
    string choice; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    public void comboBox1_SelectedIndexChanged(object sender, System.EventArgs e) 
    { 

    } 

    public void button1_Click(object sender, System.EventArgs e) 
    { 
     HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument(); 
     htmlDoc.OptionFixNestedTags = true; 

     string urlToLoad = "http://www.nbcwashington.com/weather/school-closings/"; 
     HttpWebRequest request = HttpWebRequest.Create(urlToLoad) as HttpWebRequest; 
     request.Method = "GET"; 

     Console.WriteLine(request.RequestUri.AbsoluteUri); 
     WebResponse response = request.GetResponse(); 

     htmlDoc.Load(response.GetResponseStream(), true); 
     if (htmlDoc.DocumentNode != null) 
     { 
      var articleNodes = htmlDoc.DocumentNode.SelectNodes("/html/body/div/div/div/div/div/div/p"); 



      if (articleNodes != null && articleNodes.Any()) 
      { 
       foreach (var articleNode in articleNodes) 
       { 

        textBox1.AppendText(htmlDoc.DocumentNode.SelectNodes("/html/body/div/div/div/div/div/div/p").ToString()); 

       } 
      } 
     } 

     Console.ReadLine(); 
    } 

    private void listBox1_SelectedIndexChanged(object sender, System.EventArgs e) 
    { 
     choice = listBox1.SelectedItem.ToString(); 
    } 



} 
} 

Так что же мне не хватает/здесь не так? Данные должны вернуть что-то вроде:

Warren County Public Schools Closed 
Washington Adventist University Closing at Noon 

Спасибо, что посмотрели на это.

+0

преобразовать ответ на строку, чтобы увидеть HTML, и мы расскажем вам, что это не так. Кроме того, большинство из этих проверок для null не нужны. – mybirthname

ответ

0

Nevermind, нашел проблему. Наверное, я пытался захватить узел документа вместо внутреннего текста ... Вот код на всякий случай, если кто-то захочет этого.

using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Text.RegularExpressions; 
using System.Windows.Forms; 
using System; 
using HtmlAgilityPack; 

namespace WindowsFormsApplication1 
{ 
public partial class Form1 : Form 
{ 
    string choice; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    public void comboBox1_SelectedIndexChanged(object sender, System.EventArgs e) 
    { 

    } 

    public void button1_Click(object sender, System.EventArgs e) 
    { 
     HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument(); 
     htmlDoc.OptionFixNestedTags = true; 

     string urlToLoad = "http://www.nbcwashington.com/weather/school-closings/"; 
     HttpWebRequest request = HttpWebRequest.Create(urlToLoad) as HttpWebRequest; 
     request.Method = "GET"; 

     Console.WriteLine(request.RequestUri.AbsoluteUri); 
     WebResponse response = request.GetResponse(); 

     htmlDoc.Load(response.GetResponseStream(), true); 
     if (htmlDoc.DocumentNode != null) 
     { 
      var articleNodes = htmlDoc.DocumentNode.SelectNodes("/html/body/div/div/div/div/div/div/p"); 



      if (articleNodes != null && articleNodes.Any()) 
      { 
       int k = 0; 
       foreach (var articleNode in articleNodes) 
       { 


        textBox1.AppendText(articleNode.InnerText + "\n"); 

       } 
      } 
     } 

     Console.ReadLine(); 
    } 

    private void listBox1_SelectedIndexChanged(object sender, System.EventArgs e) 
    { 
     choice = listBox1.SelectedItem.ToString(); 
    } 



} 

}

0

Поскольку articleNodes уже содержат узлы, которые вы заинтересованы в, нет необходимости вызывать SelectNodes() снова внутри цикла.

Кроме того, вам не нужно будет проверять наличие null, так как articleNodes - это коллекция. Это может быть пусто,, но не должно быть null.

Попробуйте это, доступ к свойству InnerHtml (или InnerText) вместо:

var articleNodes = htmlDoc.DocumentNode.SelectNodes("/html/body/div/div/div/div/div/div/p"); 

var result = articleNodes.Select(x => x.InnerHtml.Replace("<br><span>", " ") 
               .Replace(" </span>", "")).ToList();