2017-02-18 6 views
0

Screenshot of the code and error message+variable valuesしたがって、目標は単語を取得し、Googleの定義から単語の声部を得ることです。c#とHTMLAgilityPackを使用したWebスクレイピング

私はいくつかのアプローチを試みましたが、毎回null参照エラーが発生しています。私のコードはウェブページにアクセスできませんか?ファイアウォール問題、論理問題、{insert-issue-here}問題ですか?私は本当に何が間違っているのか曖昧な考えを持っていればいいと思う。

お時間をいただきありがとうございます。

補遺:私は試してみた "// [@id = \" ソース - ルナ\ "] // DIV" と "// [@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

ウェブページを廃棄する代わりにDictionary APIを使用することもできます。https://www.wordsapi.com/ – Tony

+0

を参照してください。再:試行2、 'doc'がnullである可能性はないと思います。その前に例外をスローしないと、コンストラクタは常にオブジェクトを返します。 – JLRishe

+0

提案していただきありがとうございます!私はここで車輪を再発明することに忙しかった。作成された後のdocの値は、試行1を除いて、上記のすべての試行に対して一貫して{HtmlAgilityPack.HtmlDocument}であるため、必ずしもnullではありませんが、null参照は例外です。 – BenjaminZBrauer

答えて

0

あなたのXPathが正しくないか、それはそれらののXPathに基づいて任意のノードを見つけることができなかったので、あなたはnullを取得しています。ここで何を達成しようとしていますか?

+0

Hung Cao返事ありがとうございますXPATHが正しくありませんでした。 :)何らかの理由で、dictionary.com、thesaurus.com、wikipediaのようなウェブサイトから要素の文章を得ることはできますが、Googleページからは取得できません。ウィキペディアの抜粋のテキストを取得したい場合は、それはGoogle検索のトップにあります。たとえば、何も返されません。 – BenjaminZBrauer

関連する問題