2014-01-16 2 views
0

Я пытаюсь вытащить данные из двух разных Div, но я могу получить данные только из первого Div (города). У меня есть код установки в качестве примера со страницы вики, где все элементы Li от H2 id = cities и id = Other_destinations:Чтение нескольких Div с помощью HtmlAgilityPack

var xpathData = "//h2[span/@id='Cities' or @id='Other_destinations']" + "/following-sibling::ul[1]" + "/li"; 

я тогда пишу все, что было в литиево-х в текстовый документ.

private void button1_Click(object sender, EventArgs e) 
    { 

     List<string> destinations = new List<string>(); 
     var xpathData = "//h2[span/@id='Cities' or @id='Other destinations']" + "/following-sibling::ul[1]" + "/li"; 

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

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

     using (StreamWriter write = new StreamWriter(@"C:\path\testText.txt")) 
     { 
      foreach (hap.HtmlNode node in doc.DocumentNode.SelectNodes(xpathData)) 
      { 

      string all = node.InnerText; 

      //Writes to text file 
      write.WriteLine(all); 
      } 
     } 

     } 

Примечание о 'hap', я должен был использовать с помощью hap = HtmlAgilityPack; из-за какой-то странный конфликт.

Спасибо за любую помощь/предложения/руководство!

ответ

0

у вас есть опечатки со вторым идентификатором в исходном коде:

var xpathData = "//h2[span/@id='Cities' or span/@id='Other_destinations']" + "/following-sibling::ul[1]" + 
         "/li"; 

Это код, который я использовал:

var destinations = new List<string>(); 
var xpathData = "//h2[span/@id='Cities' or span/@id='Other_destinations']" + "/following-sibling::ul[1]" + 
         "/li"; 

var webClient = new WebClient(); 
var html = webClient.DownloadString("http://wikitravel.org/en/Germany"); 

// to control the encoding 
var doc = new HtmlDocument 
{ 
    OptionDefaultStreamEncoding = Encoding.UTF8 
}; 

doc.LoadHtml(html); 

using (var write = new StreamWriter("testText.txt")) 
{ 
    foreach (var node in doc.DocumentNode.SelectNodes(xpathData)) 
    { 
     var all = node.InnerText; 

     //Writes to text file 
     write.WriteLine(all); 
    } 

}  
+0

Хороший улов! К сожалению, это не полностью решило проблему. Теперь он только гаснет и захватывает первый li в Div ... – cbrannin

+0

Я проверил ваш код и отлично работал на своей машине. Я собираюсь отредактировать свой ответ с помощью моего кода. Пожалуйста, запустите его. –

+0

Ну, ты прав. Этот код работает очень хорошо. С тех пор я изменил код, в котором эта часть используется, и она захватывает только первый ли из раздела «Other_destinations» Div ... Должно быть, что-то сработало где-то в другом месте ... Спасибо. – cbrannin

0

Обновлен с рабочим раствором
Так что теперь вопрос что некоторые страны имеют странную разметку. Большинство Div являются установки, как:

<h2> 
<span id="cities"></span> 
</h2> 
<ul> 
<li>...</li> 
<li>...</li> 
... 
</ul> 
<h2> 
... 
</h2> 

Но, когда я упомянул в комментариях, что это был только потянув только первый Ли из Other_destinations DIV, что происходит в том, что текущий скрипт только смотрит на первой ул а затем ли в div. Таким образом, наценка на этой странице, отдельные страны, как это:

<h2> 
<span id="Other_destinations"></span> 
</h2> 
<ul> 
<li>...</li> 
<li>...</li> 
... 
</ul> 
<h2> 
<span id="Get_in"></span> 
</h2> 

ОБНОВЛЕНО рабочий код

var xpathData = "//ul[preceding-sibling::h2[span/@id='Cities' or span/@id='Other_destinations'] and following-sibling::h2[span/@id='Get_in']]" + "/li"; 

Этот запрос работает, чтобы получить только 2 разделов информации с веб-страницы в HTML форматирования, описанные выше , Важно отметить, что текст должен быть закодирован, или он будет печатать текст с помощью «-» как «â» ». Я добавил эту кодировку для веб-клиента:

var web = new WebClient(); 
web.Encoding = System.Text.Encoding.UTF8; 
String html = string.Empty; 
html = //get URL's 

И это кодирование для документа:

var doc = new hap.HtmlDocument 
{ 
    OptionDefaultStreamEncoding = Encoding.UTF8 
}; 

doc.LoadHtml(html); 
+0

Вы можете использовать что-то вроде этого: 'xpath =" // div [@ id = 'div']/child :: ul/li "', я рекомендую вам прочитать [this] (http: // www.w3schools.com/xpath/xpath_axes.asp), действительно очень полезно. Если у вас есть другие вопросы, отправьте ответ, чтобы ответить правильно. Надеюсь, это поможет вам –

+0

О, простите, ответ. Я собирался переформатировать его, когда я достиг решения. Я пытался использовать дочерний элемент, но он возвращает пустой текстовый документ. – cbrannin

+0

Посмотрите, разместите этот вопрос и дайте мне знать в комментариях, чтобы показать вам мой код, потому что здесь я не могу опубликовать большой код –

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