Знакомимся с Data Extracting SDK. Часть 1

пятница, 11 февраля 2011, Александр Краковецкий

Data Extracting SDK – независимая разработка, которая позволяет создавать приложения для извлечения, анализа и сохранения данных. Также может быть использована для написания собственных поисковых роботов и инстументов для работы с большими объемами данными.

Data Extracting SDK использует библиотеку Microsoft.mshtml для получения DOM-дерева HTML страницы и информации об HTML элементах.

Страница на codeplex: http://extracting.codeplex.com/ (последняя версия, о которой идет речь в статье, скоро будет добавлена на сайт).

Класс UriHtmlExtractor

Класс UriHtmlExtractor может быть использован для скачивания веб-документов.

Основные возможности:

  • поддержка POST, GET запросов;
  • возможность менять User Agent;
  • поддержка запросов через прокси;
  • проверка веб-страниц на CSS, HTML валидность, на наличие robots.txt, favicon.ico;
  • получение Google PageRank.

Конструктор на вход принимает лишь один обязательный параметр – адрес страницы, остальные параметры – коллекция параметров в случае POST запроса, настройки прокси и User Agent – являются необязательными параметрами и могут использоваться в случае необходимости.

UriHtmlExtractor ext = new UriHtmlExtractor(new Uri("http://google.com/"));

Рассмотрим типичные сценарии использования UrlHtmlExtractor на таком примере:

NameValueCollection postParameters = new NameValueCollection();
postParameters.Add("name", "value");  // Добавляем параметр 1
postParameters.Add("submit", "true"); // Добавляем параметр 2

// Прикидываемся IE9 beta
string userAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)";

UriHtmlExtractor ext = new UriHtmlExtractor(new Uri("http://google.com/"),
postParameters, new WebProxy("127.0.0.1", 80), userAgent);

string html = ext.DocumentHtml; // Получаем HTML код страницы
string text = ext.DocumentText; // Получаем очищенный от HTML тэгов текст страницы

bool isCssValid = ext.IsCSSValid();
bool isHtmlValid = ext.IsHtmlMarkupValid();
bool contactUsPageExists = ext.IsPageExists("contact.php");
bool robotsExists = ext.IsRobotsTxtExists();

Uri contactUsUri = ext.FindPage("contact");
if (contactUsUri != null) { 
    // Что-то делаем
}
 
Uri foundUri = ext.FindPage(new string[] { "contact", "feedback" });
 
if (foundUri != null) {
    // Что-то делаем
}
 
ext.SaveHtml("C://1.html"); // Сохраняем код в файл 
ext.SaveText("C://1.txt");  // Сохраняем текст в файл
 
int PR = ext.GooglePageRank;

  Класс UriHtmlExtractor удобен для получения HTML кода, в то время когда разбор HTML можно сделать с помощью класса HtmlProcessor, который рассмотрим далее.

Класс HtmlProcessor

HtmlProcessor является основным инструментом для разбора HTML кода.

Возможности:

  • разбор HTML – ссылки, заголовки, мета теги, изображения;
  • поиск элементов по тегам, идентификатору, имени
  • Linq to DOM – возможность делать запросы к DOM модели страницы с помощью Linq.

Продемонстрируем возможности класса HtmlProcessor на таком примере:

string html = "<html><head><title>My page</title></head><body>" +
                    "<div class=\"divClass\" id=\"divId\">Div text.</div></body></html>";
HtmlProcessor proc = new HtmlProcessor(html);
var elements = proc.Elements;
DomElement body = proc.Body;
string source = proc.DocumentSource; // Вернет значение переменной html
string title = proc.Title; // My page
string innerText = proc.InnerText; // Div text.
bool hasFlash = proc.HasFlash; // false
string divClass = proc.GetElementById("divId").Class; // divClass
string divClassByTag = proc.GetElementsByTagName("div").FirstOrDefault().Class; // divClass
string metaDesc = proc.MetaDescription; // null
string metaKeyword = proc.MetaKeywords; // null
List<DomElement> headers = proc.Headers;
List<DataTable> htmlTables = proc.HtmlTables;
List<DomElement> images = proc.Images;
List<DomElement> links = proc.Links;
 
proc = new HtmlProcessor(new Uri("http://microsoft.com/")); 
 
// Делаем запрос к DOM модели
var q = from e in proc.Elements
        where e.TagName == "img" && e.Attributes["class"].IsNotNullOrEmpty() == true
        select e.Attributes["class"];

Большинство методов возвращают список DomElement, который содержит такие поля:

  • InnerHtml
  • InnerText
  • OuterHtml
  • OuterText
  • Id – идентификатор HTML элемента;
  • Class – CSS класс HTML элемента;
  • TagName – название тега (например, «а», «img» и т.д.)
  • Attributes – NameValueCollection аттрибутов HTML элемента.

Примечание: все названия тегов и атрибутов необходиом вводить в нижнем регистре.

Свойство HtmlTable возвращает список DataTable, в которые были преобразованы все HTML таблицы.

C помощью методом GetElementById(), GetElementsByTagName(), GetElementByName() можно получать коллекцию HTML элементов соответственно по идентификатору, тегу или названию. Также можно воспользоваться свойстами Links, Headers, Images, Metas, Scripts, которые уже содержат элементы соответствующего типа.

Класс DataExtractor

Класс DataExtrcator является хорошим помощником при работе с регулярными выражениями.

С «коробки» он позволяет извлекать такие типы данных, как:

  • Emails – электронные адреса;
  • IP адреса;
  • Phones – телефоны в американском формате;
  • CapsWord – слова в верхнем регистре;
  • Url – адреса веб-документов;
  • DateTimeLong – даты в формате «N/N/N H:M:S AM/PM».

Если необходимого типа данных нет в наличии, то можно добавить свою группу с помощью метода AddRegex(), который принимает на вход собственно само выражение и название группы. Позже, можно получить данные из конкретной группы с помощью переопределенного метода GetExtractedResults().

Пример использования класса DataExtractor:

string text = @"
    email1 = test@domain.com 
    email2 = contactus@mydomain.ru
    IP = 127.0.0.1
    Phone = (978) 369-1118, ask ALEX or LEO
    Url = http://dddddd.com:3030/page.aspx?id=5&g=6
    Url = https://microsoft.com/ or ftp://microsoft.com/
    Date = 01/02/2008 5:20:50 PM
";
DataExtractor ext = new DataExtractor(text, DataTypes.All);
ext.AddRegex(Regexes.CapsWord, "AdditionalCapsWords");
var results = ext.GetExtractedResults();
var emails = ext.GetExtractedResults("Email");
 
foreach (var result in results)
    Console.WriteLine("{0}: {1}", result.GroupName, result.Value);
 

В результате выполнения этого кода получим следующий результат:

Также в SDK есть вспомагательный класс Regexes, который содержит коллекцию наиболее употребляемых регулярных выражений.

Компании из статьи


Microsoft Украина


Сайт:
http://www.microsoft.com/ukr/ua/

Microsoft Украина Украинское подразделение компании Microsoft.

Ищите нас в интернетах!

Комментарии

Свежие вакансии