2015-07-11 2 views
2

Итак, я пытаюсь сделать инструмент Skype, который будет иметь команду «словаря», которая будет извлекать смысл слова из городского словаря в тот момент, когда я могу загрузить весь HTML-код документ в нанизывать, как это:C# HTML соскабливание между тегами

private void urbanDictionary(string term) 
     { 
      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); 
     } 

проблема заключается в том, что я хочу только то значение, которое походит так

<div class='meaning'> "meaning" </div> 

Я перепробовал все виды вещей, но я не могу управлять, чтобы получить текст между Теги «div».

Как я могу это сделать?

+0

возможно дубликат [Получить конкретные данные с веб-страницы] (http://stackoverflow.com/questions/31122891/get-specific-data-from-a-webpage) – aochagavia

+0

Какие виды вещей у вас на самом деле пытался? Это было бы очень просто с помощью HtmlAgilityPack или CsQuery (но избегайте регулярных выражений!) –

+0

Я не думаю, что это правильный способ получить смысл. Поскольку мы не можем быть на 100% уверены, что имя класса не будет изменено urbandictionary. Если в будущем команда urbandictionary изменит структуру структуры или имя класса, то вдруг вы не сможете получить значения. Вам придется менять код снова и снова. –

ответ

0

я могу предложить, в final_response строке сначала найти то добавить создать подстроку из , что индекс + «DIV класс =„значение“». Длина до конца строки. После того, как в этой подстроке найдите позицию индекса «» и используйте это снова, чтобы найти другую подстроку, содержащую текст между тегами div.

Пример. ЕСЛИ вы получаете индекс 100, затем создайте подстроку, используя 100 + 38 для завершения. Эта подстрока будет напоминать «значение». Снова найти позицию индекса позволяет предположить, что 10 затем найти подстроку от 0 до (10 -1) это даст результат, как смысл

4

Используйте библиотеку HtmlAgilityPack, именно то, что вам нужно.

http://www.codeproject.com/Articles/659019/Scraping-HTML-DOM-elements-using-HtmlAgilityPack-H

+0

Я бы убрал предложение об использовании регулярных выражений, поскольку регулярные выражения предназначены для разбора обычного текста. HTML - это ** не ** обычный текст. HTML Agility Pack - это правильный способ пойти на 100%. – Enigmativity

+0

Html Пакет ловкости +1 – iwayneo

0

Может быть, не ответ, который вы ищете. Но я использовал https://www.mashape.com, чтобы получить API для городского словаря. К несчастью, это неофициально, поэтому я не знаю, как долго это будет работать. Но, как уже упоминалось, html также может всегда меняться - скорее всего, чаще, чем API. Кроме того, API потребляет меньше полосы пропускания, что всегда должно быть предпочтительным.

Usage будет

var client = new WebClient(); 
client.Headers.Add("X-Mashape-Key", "APIKEY"); 
client.Headers.Add("Accept", "text/plain"); 
Console.WriteLine(client.DownloadString("https://mashape-community-urban-dictionary.p.mashape.com/define?term="+ term)); 
0

Есть два варианта.

1) Вы можете использовать Regex для удаления HTML-тегов. Это короткий и сладкий, и вы можете использовать его, если источник HTML, с которым вы имеете дело, не является сложным.

string meaningStr = Regex.Replace(final_response, @"<[^>]+>", "").Trim(); 

Вы можете найти выше решение испытанный в прямом эфире на: regexstorm.net/tester

2) Вы можете использовать HTMLAgilityPack. Этот метод рекомендуется, но вам нужно потратить несколько усилий на его настройку. С Нугэтом это не так сложно.

HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml(final_response); 
final_response = doc.InnerText; 
Смежные вопросы