0

Я новичок в C#, поэтому это может быть очень очевидно, как заставить это работать или слишком сложно для меня, но я пытаюсь настроить и очистить веб-страницу с помощью HtmlAgilityPack. В настоящее время мой код компилируется, но когда я пишу строку, я получаю только 1 результат, и это последний результат из li в ul. Причина разделения строк заключается в том, что я могу в конечном итоге вывести строки заголовка и описания в .csv для дальнейшего использования. Я просто не уверен, что делать дальше, поэтому я прошу любую помощь/понимание/идеи/мысли/предложения, которые могут быть предложены. Спасибо!Веб-скребок с использованием HtmlAgilityPack

private void button1_Click(object sender, EventArgs e) 
    { 
     List<string> cities = new List<string>(); 
     //var xpath = "//h2[span/@id='Cities']"; 
     var xpath = "//h2[span/@id='Cities']" + "/following-sibling::ul[1]" + "/li"; 

     WebClient web = new WebClient(); 
     String html = web.DownloadString("http://wikitravel.org/en/Vietnam"); 

     hap.HtmlDocument doc = new hap.HtmlDocument(); 
     doc.LoadHtml(html); 


     foreach (hap.HtmlNode node in doc.DocumentNode.SelectNodes(xpath)) 
     { 
      string all = node.InnerText; 

      //splits text between '—', '-' or ' ' into 2 parts 
      string[] split = all.Split(new char[] { '—', ' ', '-' }, StringSplitOptions.None); 

      string title; 
      string description; 

      int nodeCount; 
      nodeCount = node.ChildNodes.Count; 

      if (nodeCount == 2) 
      { 
       title = node.ChildNodes[0].InnerText; 
       description = node.ChildNodes[1].InnerText; 
      } 
      else if (nodeCount == 4) 
      { 
       title = node.ChildNodes[0].InnerText; 
       description = node.ChildNodes[1].InnerText + node.ChildNodes[2].InnerText; 
      } 
      else 
      { 
       title = "Error"; 
       description = "The node cound was not 2 or 3. Check the div section."; 
      } 

      System.IO.StreamWriter write = new System.IO.StreamWriter(@"C:\Users\cbrannin\Desktop\textTest\testText.txt"); 
      write.WriteLine(all); 

      write.Close(); 


     } 

    } 
} 

ответ

2

Одна из проблем заключается в том, что вы каждый раз переписываете выходной файл через цикл. Вы, вероятно, хотите сделать это:

using (StreamWriter write = new StreamWriter(@"filename")) 
{ 
    foreach (hap.HtmlNode node in doc.DocumentNode.SelectNodes(xpath)) 
    { 
     // do your thing 
     write.WriteLine(all); 
    } 
} 

Кроме того, у вас одного активизировали это, чтобы увидеть, если вы получаете больше, чем один HtmlNode от вашего SelectNode звонка?

Наконец, я не вижу, где вы делаете что-либо с title или description. Вы планировали использовать их для чего-то еще?

+0

Этот отпечаток отлично работает, и я дурак для того, чтобы начать использовать его в неправильном месте. Все города теперь печатают в текстовый файл. Причина названия и описания состоит в том, чтобы имя города заполнило эту строку, а затем описание города заполнило строку описания, поэтому я могу настроить CSV-файл для использования этих данных позже. В этом причина расщепления этих персонажей - «,», «-». Идея состоит в том, чтобы настроить эти данные в формате .csv, ключевое слово - идея ... Спасибо за ответ! – cbrannin

+0

@cbrannin: Если это решило вашу проблему, отметьте ее как принятый ответ. –

Смежные вопросы