2017-02-18 17 views
0

Screenshot of the code and error message+variable values Итак, цель - взять слово и получить часть речи слова из определения Google.Веб-скребок с C# и HTMLAgilityPack

Я пробовал несколько разных подходов, но каждый раз получаю ошибку с нулевой ссылкой. Мой код не имеет доступа к веб-странице? Это проблема межсетевого экрана, проблема с логикой, проблема {insert-issue-here}? Мне очень жаль, что у меня не было смутного представления о том, что не так.

Спасибо за ваше время.

Добавление: Я пытался "// [@id = \" источник - луна \ "] // ДИВ" и "// [@id = \" источник - луна \ "]/div 1 "как значения XPath.

//attempt 1//////////////////////////////////////////////////////////////////////// 
 
      var term = "Hello"; 
 
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.urbandictionary.com/define.php?term=" + term); 
 
      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
 

 
      StreamReader stream = new StreamReader(response.GetResponseStream()); 
 
      string final_response = stream.ReadToEnd(); 
 

 
      MessageBox.Show(final_response); //doesn't execute 
 

 
//attempt 2//////////////////////////////////////////////////////////////////////// 
 
      var url = "https://www.google.co.za/search?q=define+position"; 
 
      var content = new System.Net.WebClient().DownloadString(url); 
 
      var webGet = new HtmlWeb(); 
 
      var doc = new HtmlAgilityPack.HtmlDocument(); 
 
      doc.LoadHtml(content); 
 
    //doc is null at runtime 
 
      HtmlNode ourNode = doc.DocumentNode.SelectSingleNode("//*[@id=\"uid_0\"]/div[1]/div/div[1]/div[2]/div[2]/div[1]/i/span"); 
 
      if (ourNode != null) 
 
      { 
 
       richTextBox1.AppendText(ourNode.InnerText); 
 
      } 
 
      else 
 
       richTextBox1.AppendText("null"); 
 

 
//attempt 3//////////////////////////////////////////////////////////////////////// 
 
var webGet = new HtmlWeb(); 
 
      var doc = webGet.Load("https://www.google.co.za/search?q=define+position"); 
 
    //doc is null at runtime 
 
      HtmlNode ourNode = doc.DocumentNode.SelectSingleNode("//*[@id=\"uid_0\"]/div[1]/div/div[1]/div[2]/div[2]/div[1]/i/span"); 
 
      if (ourNode != null) 
 
      { 
 
       richTextBox1.AppendText(ourNode.InnerText); 
 
      } 
 
      else 
 
       richTextBox1.AppendText("null"); 
 

 
//attempt 4//////////////////////////////////////////////////////////////////////// 
 
string Url = "http://www.metacritic.com/game/pc/halo-spartan-assault"; 
 
      HtmlWeb web = new HtmlWeb(); 
 
      HtmlAgilityPack.HtmlDocument doc = web.Load(Url); 
 
    //doc is null at runtime 
 
      string metascore = doc.DocumentNode.SelectNodes("//*[@id=\"main\"]/div[3]/div/div[2]/div[1]/div[1]/div/div/div[2]/a/span[1]")[0].InnerText; 
 
      string userscore = doc.DocumentNode.SelectNodes("//*[@id=\"main\"]/div[3]/div/div[2]/div[1]/div[2]/div[1]/div/div[2]/a/span[1]")[0].InnerText; 
 
      string summary = doc.DocumentNode.SelectNodes("//*[@id=\"main\"]/div[3]/div/div[2]/div[2]/div[1]/ul/li/span[2]/span/span[1]")[0].InnerText; 
 
      richTextBox1.AppendText(metascore + " " + userscore + " " + summary); 
 

 
//attempt 5//////////////////////////////////////////////////////////////////////// 
 
      HtmlWeb web = new HtmlWeb(); 
 
      HtmlAgilityPack.HtmlDocument html = web.Load("https://www.google.co.za/search?q=define+position"); 
 
    //html is null 
 
      var div = html.DocumentNode.SelectNodes("//*[@id=\"uid_0\"]/div[1]/div/div[1]/div[2]/div[2]/div[1]/i/span"); 
 
      richTextBox1.AppendText(Convert.ToString(div));

+0

Вы можете использовать некоторый словарь API вместо того, чтобы сломать веб-страницы, см. Https://www.wordsapi.com/ – Tony

+0

Re: Попытка 2, я не думаю, что «doc» может быть пустым. Конструктор всегда возвращает объект, если перед этим не возникает исключение. – JLRishe

+0

Спасибо за предложение! Я занят изобретать колесо здесь. Значение doc после его создания постоянно {HtmlAgilityPack.HtmlDocument} для всех вышеперечисленных попыток, за исключением попытки 1, поэтому его необязательная нулевая, но нулевая ссылка - это исключение, вызванное – BenjaminZBrauer

ответ

0

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

+0

Хун Цао благодарит вас за ваш ответ, да, кажется, мой XPATH были неверными. Он работает сейчас. :) по какой-то причине я могу получить внутренний текст элементов с веб-сайтов, таких как dictionary.com, thesaurus.com и wikipedia, но не с страниц Google ... если бы я хотел захватить текст фрагмента википедии, который входит в начало поиска Google, например, он ничего не возвращает. – BenjaminZBrauer