суббота, 14 марта 2009 г.

парсер (основы)

Для наилучшего понимания парсинга разберем основы. Например Вам необходимо извлечь из странички тэг ЖК-телевизор (про библиотеку SGML я напишу в следующий раз):
  1. <div style="display: none;" id="full-spec-cont">
  2. <img class="b-banish" src="http://clck.yandex.ru/click/dtype=stred/pid=47/cid=2073/*http://market.yandex.ru/i/edot.gif"><table border="0" width="48%" cellspacing="0" cellpadding="5" class="modelProperties">
  3. <colgroup span="2"></colgroup>
  4. <tbody>
  5. <tr><td colspan="2" class="title"><b>Основные характеристики</b></td></tr>
  6. <tr>
  7. <td class="label"><span>Тип</span></td>
  8. <td>ЖК-телевизор</td>
  9. </tr>
  10. <tr>
  11. <td> </td>
  12. <td> </td>
  13. </tr>
  14. <tr>
  15. <td class="label"><span>Встроенный DVD-плеер</span></td>
  16. <td>есть</td>
  17. </tr>
  18. <tr>
  19. <td> </td>
  20. <td> </td>
  21. </tr>
  22. </tbody>
  23. </table>
  24. </div>
Будем искать узел ЖК-телевизор, смотрим что он заключен в тэги (по порядку):
  1. <td>...</td>
  2. <tr>...</tr>
  3. <tbody>...</tbody>
  4. <table>...</table>

Значит XPath для искомого текста будет таким: //div[@id='full-spec-cont']/table/tbody/tr/td, где // - означает что будем искать по всему коду полученной странички, а не остановимся на первом же попавшемся тэге. [@id='full-spec-cont'] - означает что будет выбран тэг с атрибутом [@id='full-spec-cont'] и никакой другой. Однако в коде нашей странички присутствуют тэги пустышки (строки 11, 12, 19 и 20), для этого в XPath сообщаем, что будем выбирать тэг который следует сразу за тэгом "td class="label", а никак не пустые тэги, в итоге получим XPath "//div[@id='full-spec-cont']/table/tbody/tr/td[@class=\'label\']/following-sibling::*". В этом посте я указывал ссылку на ресурс разъясняющий основы XPath. Пример кода C# для получения искомого узла:

// определяем строку для поиска в коде html(xml) странички
string xpathOpisanie = "//div[@id='full-spec-cont']/table/tbodi/tr/td[@class=\'label\']following-sibling::*";
string OPISANIE;
// Ищем узел ЖК-Телевизор
try
{
XmlNode node = document.SelectSingleNode(xpathOpisanie);
OPISANIE= node.InnerText;

}
catch(Exception ee)
{
MessageBox.Show (ee.ToString(),"Ошибка");
return;
}Syhi-подсветка кода