Какой рейтинг вас больше интересует?
|
Главная / Главные темы / Тэг «farina»
Парсинг HTML-страниц на примере Yandex.Маркет (с HtmlAgilityPack) 2012-10-19 09:07:35
+ развернуть текст сохранённая копия
Довольно часто возникает ситуация, когда в автоматическом режиме нужно получить какие-то данные со страницы в формате HTML или XHTML. Парсить можно разными способами, используя встроенные в Framework средства или сторонние библиотеки.
На сегодняшний день мне известны два способа парсинга:
с помощью регулярных выражений;
с помощью XPath.
В данной статье разберем, как можно использовать XPath для получения нужного текста.
Предположим, что нам необходимо получить характеристики товара со страницы http://market.yandex.ua/model-spec.xml?modelid=7911905&hid=90639.
Первая часть работы — получение html-текста страницы. Как вы его получите, — это уже второй вопрос или через WebClient, компонент браузера или загрузите файл с жесткого диска.
Вторая часть работы сводится собственно к парсингу нужного текста. Для начала нам необходимо получить XPath к заданном элементу в структуре HTML или XHTML. Чтобы не писать все руками, открываем браузер Chrome или Firefox с плагином Firebug. В браузере F12 и попадаем в исходный код страницы. Выбираем искомый элемент и нажимаем правую кнопку мыши. В выпадающем меню выбираем Copy XPath. В Firefox по аналогии.
В результате в буфере обмена будет текст (для Chrome):
//*[@id="js"]/body/table[3]/tbody/tr/td[2]/table
Firefox:
/html/body/table[3]/tbody/tr/td[2]/table
В этом тексте описан полный путь к элементу. Но, здесь есть нужно кое-что изменить. Во первых всегда нужно убирать tbody., во вторых нет необходимости писать html или *[@id="js"], в случае с Chrome.
Нам достаточно строки:
//body/table[3]/tr/td[2]/table
Теперь берем библиотеку HtmlAgilityPack и скармливаем ей наш путь и исходный текст страницы следующим образом:
public string GetDescription(string html)
{
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.OptionFixNestedTags = true; //Опционально, если требуется
doc.Load(new StringReader(html));
HtmlNode node = doc.DocumentNode.SelectSingleNode("//body/table[3]/tr/td[2]/table");
return node.OuterHtml;
}
В данном случае мы передаем тело html-страницы и через SelectSingleNode получаем исходный код таблицы. Обратите внимание, чтобы получить html-код найденной таблицы, необходимо использовать свойство OuterHtml. Свойство InnerHtml вернет чистый текст без тегов. Таким образом, мы на выходе метода получим таблицу, которую можно разобрать и обработать.
Все остальные данные по товару получаем по схожей схеме.
Источник http://krez0n.org.ua
Тэги: form, internet, web, window
Автозаполнение в WebBrowser 2012-10-19 08:48:54
+ развернуть текст сохранённая копия
Данный пример показывает как легко и просто можно реализовать авто заполнение в компоненте WebBrowser. Мне данный пример пригодился для авто заполнения формы и автоматической регистрации на сайте www.masterlike.ru
Для работы нам понадобится разместить компонент WebBrowser на форму! Теперь буду пытаться объяснить как выполнить данную задачу на примере сайта www.masterlike.ru. Вот так у него выглядит форма регистрации:
Давайте подробнее рассмотрим что мы можем здесь заполнить автоматически, это будут все поля кроме поля ввода кода подтверждения так как он всегда разный! Теперь необходимо определить имена полей которые мы заполняем, для этого открываем браузер Chrome и переходим на нашу страничку www.masterlike.ru,после полной загрузки страницы нажимаем "F12". У нас появится дополнительное окно:
Далее нам необходимо узнать ID первого текстового поля, ввода Логин. Для это правой клавишей мыши нажимаем на это текстовое поле и выбираем пункт "Просмотр кода элемента".
После этого мы увидим код необходимого нам текстового поля.
В этом коде нам необходим всего лишь один параметр, это id компонента:
input data-val-regex-pattern="[a-zA-Z0-9-]{1,}" data-val-regex="The field UserName must match the regular expression '[a-zA-Z0-9-]{1,}'." data-val-required="The UserName field is required." data-val="true" id="UserName" name="UserName" size="50" type="text" value=""
Для поля ввода "Логин" это будет "UserName". Теперь его необходимо заполнить:
webBrowser1.Document.GetElementById("UserName").SetAttribute("value", "csharpcoderr");
В примере выше мы извлекли отдельный объект System.Windows.Forms.HtmlElement с использованием атрибута ID GetElementById("UserName") этого элемента в качестве поискового ключа и задали значение атрибута с заданным именем(value) в элементе.
С остальными полями поступаете так же. Единственное что нам осталось это поставить галочку "Я согласен с правилами системы". Для это мы выполняем все те же действия как и для текстового поля и получаем ID нашего checkbox.
HtmlDocument rememberme = this.webBrowser1.Document;
rememberme.GetElementById("helpbox").SetAttribute("checked", "true");
Думаю здесь мне уже не надо ничего обьяснять. Вот полный пример кода для заполнения формы регистрации сайта www.masterlike.ru
private void button1_Click(object sender, EventArgs e)
{
if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
{
webBrowser1.Document.GetElementById("UserName").SetAttribute("value", "csharpcoderr");
webBrowser1.Document.GetElementById("Email").InnerText = "info@csharpcoderr.com";
webBrowser1.Document.GetElementById("Password").InnerText = "11111111";
webBrowser1.Document.GetElementById("ConfirmedPassword").InnerText = "11111111";
webBrowser1.Document.GetElementById("Phonecode").InnerText = "7922";
webBrowser1.Document.GetElementById("Phone").InnerText = "7946455";
HtmlDocument rememberme = this.webBrowser1.Document;
rememberme.GetElementById("helpbox").SetAttribute("checked", "true");
}
}
Тэги: form, internet, web, window
Проверяем машины на доступность 2012-10-15 14:58:56
+ развернуть текст сохранённая копия
Есть много утилит, чтобы помочь контролировать ваши компьютеры в сети, но что, если вам необходимо интегрировать информацию о состоянии системы в ваше собственное приложение? Допустим у вас есть список машин вашей сети и вы хотите быстро проанализировать их доступность, обычно просто открывают командную строку и выполняют команду Ping! А что если таких машин сотни или тысячи?
Для решения данной задачи можно воспользоваться командой Ping пространства имен System.Net.NetworkInformation.
Ping Pinger = new Ping();
PingReply Reply = Pinger.Send("127.0.0.1");
Приведенный выше код создает новый экземпляр класса Ping, а затем отправляет пинг на локальный компьютер. Взгляните на другой пример. На этот раз вы начнете со списка компьютеров, которые должны быть проверены. Например, перебор каждого компьютера в списке, диагностика компьютера и отображение результатов. Список компьютеров может содержать либо IP-адресов(192.168.1.243) или веб-сайтов(www.google.ru) или Net-Bios имена(OAOKOMP1). Для этого примера я включил несколько внутренних систем, а также пару сайтов.
List IPs = new List();
IPs.Add("10.1.1.12");
IPs.Add("10.1.1.15");
IPs.Add("OAOkomp1");
IPs.Add("192.168.173.160");
IPs.Add("www.google.com");
IPs.Add("www.amazon.com");
Ping Pinger = new Ping();
foreach (string ip in IPs)
{
PingReply Reply = Pinger.Send(ip);
Console.WriteLine("Ping " + ip + ": " + Reply.Status.ToString());
}
С помощью всего нескольких строк кода, теперь вы можете определить состояние ваших компьютеров в вашей локальной сети или в интернете. Ping класс предоставляет несколько опций, которые можно использовать для управления запросами, а также возможность отправки асинхронных запросов.
Тэги: console, form, internet, network, ping, window
Мониторинг буфера обмена 2012-10-15 09:02:37
+ развернуть текст сохранённая копия
Обзор
ОС Windows поддерживает список, или цепь, приложений, которые обратились с просьбой получить уведомление, когда данные поступят в буфер обмена. Каждый раз, когда в буфере обмена изменяется данные, первое приложение в этой цепочке получает сообщение - WM_DRAWCLIPBOARD. Приложения могут запросить тип данных в буфере обмена, например RTF, ASCII текст, и так далее. Так как нет управляемых (. NET) API для добавления приложения в цепочку, чтобы получать уведомление об изменении буфера, вы должны использовать Win32 SetClipboardViewer. Вы должны знать некоторые общие правила при использовании этой функции.
• При вызове SetClipboardViewer, вам необходимо пройти дескриптор окна, которое будет получать сообщение WM_DRAWCLIPBOARD. SetClipboardViewer функция возвращает текущее первое приложение в цепочке. Ваше приложение должно хранить в классе членов, потому что каждое приложение которое получает сообщение WM_DRAWCLIPBOARD может отправить то же сообщение к следующему приложению в цепочке (через функцию SendMessage).
• WM_CHANGECBCHAIN. Поскольку каждое приложение, которое обрабатывает WM_DRAWCLIPBOARD, отвечает за отправку этого сообщения к следующему приложению в цепочке, оно также должно знать, когда изменилась цепь. Буфер обмена посылает сообщения WM_CHANGECBCHAIN , когда приложение удалило себя из цепочки.
• При завершении работы необходимо удалить приложение из цепочки. Эта задача решается с помощью Win32ChangeClipboardChain функции, и это может быть сделано в любое время, буфер обмена мониторинга больше не нужен.
Для работы вам понадобится разместить компонент richTextBox. Так же в его свойствах ForeColor указать цвет Black!
Вот код приложения:
IntPtr nextClipboardViewer;
public Form1()
{
InitializeComponent();
nextClipboardViewer = (IntPtr)SetClipboardViewer((int)
this.Handle);
}
[DllImport("User32.dll")]
protected static extern int
SetClipboardViewer(int hWndNewViewer);
[DllImport("User32.dll", CharSet=CharSet.Auto)]
public static extern bool
ChangeClipboardChain(IntPtr hWndRemove,
IntPtr hWndNewNext);
[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern int SendMessage(IntPtr hwnd,
int wMsg,
IntPtr wParam,
IntPtr lParam);
protected override void WndProc(ref System.Windows.Forms.Message m)
{
const int WM_DRAWCLIPBOARD = 0x308;
const int WM_CHANGECBCHAIN = 0x030D;
switch (m.Msg)
{
case WM_DRAWCLIPBOARD:
DisplayClipboardData();
SendMessage(nextClipboardViewer, m.Msg, m.WParam,
m.LParam);
break;
case WM_CHANGECBCHAIN:
if (m.WParam == nextClipboardViewer)
nextClipboardViewer = m.LParam;
else
SendMessage(nextClipboardViewer, m.Msg, m.WParam,
m.LParam);
break;
default:
base.WndProc(ref m);
break;
}
}
void DisplayClipboardData()
{
try
{
IDataObject iData = new DataObject();
iData = Clipboard.GetDataObject();
if (iData.GetDataPresent(DataFormats.Rtf))
richTextBox1.Rtf = (string)iData.GetData(DataFormats.Rtf);
else if (iData.GetDataPresent(DataFormats.Text))
richTextBox1.Text = (string)iData.GetData(DataFormats.Text);
else
richTextBox1.Text = "[Clipboard data is not RTF or ASCII Text]";
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
Так же вам необходимо в Form1.Designer.cs заменить функцию Dispose:
С:
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}
НА:
protected override void Dispose(bool disposing)
{
ChangeClipboardChain(this.Handle, nextClipboardViewer);
if (disposing)
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}
Скриншот получившегося приложения:
Тэги: application, form, system, window
"Хоббит" грядёт 2012-09-23 11:52:41
+ развернуть текст сохранённая копия
Вот и до постера дожили. Бильбо смотрит с него скептически, держа меч не слишком профессионально, – всё-таки хоббиты мирный народ. Меч, естественно, эльфийский. А за плечами нашего симпатичного Бильбо, по меткому выражению старины Гэндальфа, тьма сгущается над Средиземьем. Подмолодили, надо сказать, Фримена здорово, – сравнить с тем же Ватсоном, тот выглядит гораздо старше. Ну что же, товарищу Сумкину это на пользу. Жду, не дождусь гномов, и надеюсь, что в этом фильме они не будут клоунами, а покажут себя, как моя любимая раса – серьёзными могучими ребятами. День – 14 декабря – проставлен вполне внятно, но вот к какому году этот декабрь относится... Что-то коварная память подсказывает мне, что это не ближайший к нам, а следующий декабрь. Ну что же, мы дождёмся, мы терпеливые. Настроение сейчас - киносмотрительскоеВ колонках играет - практически тишина
Тэги: freeman, hobbit, martin, властелин, гном, кино, колец, любить, мартин, настроение, синема, сказка, толкиен, толкин, фримен, хоббит, экранизация
Главная / Главные темы / Тэг «farina»
|
Взлеты Топ 5
Падения Топ 5
|