Как спарсить любой сайт?

Меня зовут Даниил Охлопков, и я расскажу про свой подход к написанию скриптов, извлекающих данные из интернета: с чего начать, куда смотреть и что использовать.
Написав тонну парсеров, я придумал алгоритм действий, который не только минимизирует затраченное время на разработку, но и увеличивает их живучесть, робастность, масштабируемость.
TL;DR
Чтобы спарсить данные с вебсайта, пробуйте подходы именно в таком порядке:
- Найдите официальное API,
- Найдите XHR запросы в консоли разработчика вашего браузера,
- Найдите сырые JSON в html странице,
- Отрендерите код страницы через автоматизацию браузера,
- Если ничего не подошло — пишите парсеры HTML кода.
Совет профессионалов: не начинайте с BS4/Scrapy
BeautifulSoup4 и Scrapy — популярные инструменты парсинга HTML страниц (и не только!) для Python.
Крутые вебсайты с крутыми продактами делают тонну A/B тестов, чтобы повышать конверсии, вовлеченности и другие бизнес-метрики. Для нас это значит одно: элементы на вебстранице будут меняться и переставляться. В идеальном мире, наш написанный парсер не должен требовать доработки каждую неделю из-за изменений на сайте.
Приходим к выводу, что не надо извлекать данные из HTML тегов раньше времени: разметка страницы может сильно поменяться, а CSS-селекторы и XPath могут не помочь. Используйте другие методы, о которых ниже. ⬇️
Используйте официальный API
Ого? Это не очевидно ? Конечно, очевидно! Но сколько раз было: сидите пилите парсер сайта, а потом БАЦ — нашли поддержку древней RSS-ленты, обширный sitemap.xml или другие интерфейсы для разработчиков. Становится обидно, что поленились и потратили время не туда. Даже если API платный, иногда дешевле договориться с владельцами сайта, чем тратить время на разработку и поддержку.
Sitemap.xml — список страниц сайта, которые точно нужно проиндексировать гуглу. Полезно, если нужно найти все объекты на сайте. Пример: http://techcrunch.com/sitemap.xml
RSS-лента — API, который выдает вам последние посты или новости с сайта. Было раньше популярно, сейчас все реже, но где-то еще есть! Пример: https://habr.com/ru/rss/hubs/all/
Поищите XHR запросы в консоли разработчика

Все современные вебсайты (но не в дарк вебе, лол) используют Javascript, чтобы догружать данные с бекенда. Это позволяет сайтам открываться плавно и скачивать контент постепенно после получения структуры страницы (HTML, скелетон страницы).

Обычно, эти данные запрашиваются джаваскриптом через простые GET/POST запросы. А значит, можно подсмотреть эти запросы, их параметры и заголовки — а потом повторить их у себя в коде! Это делается через консоль разработчика вашего браузера (developer tools).
В итоге, даже не имея официального API, можно воспользоваться красивым и удобным закрытым API. ☺️
Даже если фронт поменяется полностью, этот API с большой вероятностью будет работать. Да, добавятся новые поля, да, возможно, некоторые данные уберут из выдачи. Но структура ответа останется, а значит, ваш парсер почти не изменится.
Алгорим действий такой:

- Открывайте вебстраницу, которую хотите спарсить
- Правой кнопкой -> Inspect (или открыть dev tools как на скрине выше)
- Открывайте вкладку Network и кликайте на фильтр XHR запросов
- Обновляйте страницу, чтобы в логах стали появляться запросы
- Найдите запрос, который запрашивает данные, которые вам нужны
- Копируйте запрос как cURL и переносите его в свой язык программирования для дальнейшей автоматизации.
Вы заметите, что иногда эти XHR запросы включают в себя огромные строки — токены, куки, сессии, которые генерируются фронтендом или бекендом. Не тратьте время на ревёрс фронта, чтобы научить свой парсер генерировать их тоже.
Вместо этого попробуйте просто скопипастить и захардкодить их в своем парсере: очень часто эти строчки валидны 7-30 дней, что может быть окей для ваших задач, а иногда и вообще несколько лет. Или поищите другие XHR запросы, в ответе которых бекенд присылает эти строчки на фронт (обычно это происходит в момент логина на сайт). Если не получилось и без куки/сессий никак, — советую переходить на автоматизацию браузера (Selenium, Puppeteer, Splash — Headless browsers) — об этом ниже.
Поищите JSON в HTML коде страницы
Как было удобно с XHR запросами, да? Ощущение, что ты используешь официальное API. Приходит много данных, ты все сохраняешь в базу. Ты счастлив. Ты бог парсинга.
Но тут надо парсить другой сайт, а там нет нужных GET/POST запросов! Ну вот нет и все. И ты думаешь: неужели расчехлять XPath/CSS-selectors? ♀️ Нет! ♂️
Чтобы страница хорошо проиндексировалась поисковиками, необходимо, чтобы в HTML коде уже содержалась вся полезная информация: поисковики не рендерят Javascript, довольствуясь только HTML. А значит, где-то в коде должны быть все данные.
Современные SSR-движки (server-side-rendering) оставляют внизу страницы JSON со всеми данные, добавленный бекендом при генерации страницы. Стоп, это же и есть ответ API, который нам нужен!
Вот несколько примеров, где такой клад может быть зарыт (не баньте, плиз):


Алгоритм действий такой:
- В dev tools берете самый первый запрос, где браузер запрашивает HTML страницу (не код текущий уже отрендеренной страницы, а именно ответ GET запроса).
- Внизу ищите длинную длинную строчку с данными.
- Если нашли — повторяете у себя в парсере этот GET запрос страницы (без рендеринга headless браузерами). Просто requests.get .
- Вырезаете JSON из HTML любыми костылямии (я использую html.find(«= <") ).
Отрендерите JS через Headless Browsers
Если XHR запросы требуют актуальных tokens, sessions, cookies. Если вы нарываетесь на защиту Cloudflare. Если вам обязательно нужно логиниться на сайте. Если вы просто решили рендерить все, что движется загружается, чтобы минимизировать вероятность бана. Во всех случаях — добро пожаловать в мир автоматизации браузеров!
Если коротко, то есть инструменты, которые позволяют управлять браузером: открывать страницы, вводить текст, скроллить, кликать. Конечно же, это все было сделано для того, чтобы автоматизировать тесты веб интерфейса. I’m something of a web QA myself.
После того, как вы открыли страницу, чуть подождали (пока JS сделает все свои 100500 запросов), можно смотреть на HTML страницу опять и поискать там тот заветный JSON со всеми данными.
driver.get(url_to_open) html = driver.page_source
Selenoid — open-source remote Selenium cluster
Для масштабируемости и простоты, я советую использовать удалённые браузерные кластеры (remote Selenium grid).
Недавно я нашел офигенный опенсорсный микросервис Selenoid, который по факту позволяет вам запускать браузеры не у себя на компе, а на удаленном сервере, подключаясь к нему по API. Несмотря на то, что Support team у них состоит из токсичных разработчиков, их микросервис довольно просто развернуть (советую это делать под VPN, так как по умолчанию никакой authentication в сервис не встроено). Я запускаю их сервис через DigitalOcean 1-Click apps: 1 клик — и у вас уже создался сервер, на котором настроен и запущен кластер Headless браузеров, готовых запускать джаваскрипт!
Вот так я подключаюсь к Selenoid из своего кода: по факту нужно просто указать адрес запущенного Selenoid, но я еще зачем-то передаю кучу параметров бразеру, вдруг вы тоже захотите. На выходе этой функции у меня обычный Selenium driver, который я использую также, как если бы я запускал браузер локально (через файлик chromedriver).
def get_selenoid_driver( enable_vnc=False, browser_name="firefox" ): capabilities = < "browserName": browser_name, "version": "", "enableVNC": enable_vnc, "enableVideo": False, "screenResolution": "1280x1024x24", "sessionTimeout": "3m", # Someone used these params too, let's have them as well "goog:chromeOptions": , "prefs": < "credentials_enable_service": False, "profile.password_manager_enabled": False >, > driver = webdriver.Remote( command_executor=SELENOID_URL, desired_capabilities=capabilities, ) driver.implicitly_wait(10) # wait for the page load no matter what if enable_vnc: print(f"You can view VNC here: ") return driver
Заметьте фложок enableVNC . Верно, вы сможете смотреть видосик с тем, что происходит на удалённом браузере. Всегда приятно наблюдать, как ваш скрипт самостоятельно логинится в Linkedin: он такой молодой, но уже хочет познакомиться с крутыми разработчиками.
Парсите HTML теги
Мой единственный совет: постараться минимизировать число фильтров и условий, чтобы меньше переобучаться на текущей структуре HTML страницы, которая может измениться в следующем A/B тесте.

Даниил Охлопков — Data Lead @ Runa Capital
Подписывайтесь на мой Телеграм канал, где я рассказываю свои истории из парсинга и сливаю датасеты.
Надеюсь, что-то из этого было полезно! Я считаю, что в парсинге важно, с чего ты начинаешь. С чего начать — я рассказал, а дальше ваш ход
Как на С++ парсить html страничку?
Нужно выковыривать текст и удалять все лишнее, а текст раскидан и разбит по ячейкам таблицы. Давайте в качестве примера возьмем эту страницу http://hashcode.ru/questions/120273/%D0%BA%D0%B0%D0%BA-%D0%BD%D0%B0-%D1%81-%D0%BF%D0%B0%D1%80%D1%81%D0%B8%D1%82%D1%8C-html-%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%BA%D1%83 не, очень сложная страница. нужно чтото попроще типа хабрахабра
Отслеживать
Тентаклькоацтль
задан 18 июн 2012 в 17:33
Тентаклькоацтль Тентаклькоацтль
310 1 1 золотой знак 2 2 серебряных знака 12 12 бронзовых знаков
Хм, может немного не в тему, но не поделитесь ли вашей задачей?
18 июн 2012 в 17:46
Точной задачи я не формулировал. Хочу брать страницы и убирать все кроме собственно текста как в аддонах Clearly и Redability, а то надоело, что страницы тянут с собой кучу мусора.
18 июн 2012 в 21:34
Интересуют библиотеки парсинга заточенные под html\xml.
18 июн 2012 в 21:36
@Alex Dok, Если вам дан исчерпывающий ответ, отметьте его как верный (нажмите на галку рядом с выбранным ответом).
19 июн 2012 в 6:16
Нет, пока ответа с примером не увидел, а так хотелось)))
22 июн 2012 в 8:02
5 ответов 5
Сортировка: Сброс на вариант по умолчанию
Либо парсить самому, либо использовать спец. библиотеку например htmlcxx
Отслеживать
51.4k 86 86 золотых знаков 267 267 серебряных знаков 505 505 бронзовых знаков
ответ дан 18 июн 2012 в 17:41
300 1 1 серебряный знак 4 4 бронзовых знака
Парсил, используя libxml. Строишь объектную модель, а потом запросами или траверсить дерево. Желательно, но вообще говоря не обязательно, чтобы документ был валиден (по крайней мере корректно сформирован).
Отслеживать
ответ дан 18 июн 2012 в 21:23
northerner northerner
4,191 15 15 серебряных знаков 15 15 бронзовых знаков
Ещё можно использовать flex. Unicode он не понимает, но html-теги как раз можно.
Отслеживать
ответ дан 18 июн 2012 в 18:22
6,894 2 2 золотых знака 27 27 серебряных знаков 57 57 бронзовых знаков
Почуствовал себя мамонтом: я под flex понимаю генератор лексических анализаторов. В принципе в паре с bison тоже применимо — построить грамматику и транслятор и погнали 🙂
18 июн 2012 в 21:27
Ну можно обойтись одним лексом, если не нужно проверять правильность вложенности тегов.
18 июн 2012 в 21:33
Можно, но это грустные странички какие-то будут только, плоские 🙂
18 июн 2012 в 21:35
Цель то выковырять текст между тегами
19 июн 2012 в 6:10
На мой взгляд, регулярные выражения для этих целей вполне подойдут. Например, Boost.Regex. Алгоритм прост: поиск ( regex_search ) — замена ( regex_replace ), и так до конца файла.
Отслеживать
ответ дан 18 июн 2012 в 17:38
vladimir_ki vladimir_ki
1,923 10 10 серебряных знаков 12 12 бронзовых знаков
18 июн 2012 в 21:19
@Котик_хочет_кушать, вы правы, решение не удачное.
19 июн 2012 в 6:12
ИМХО для просто странички регулярных выражений многовато будет. А в чем проблема то?!
- Получили страничку
- Нашли таблицу
- Разбили содержимое
Что-то конкретное не получается? Для поиска в тексте можно использовать хоть готовые классы с их функциями типа find substr или самому что-нибудь простецкое написать, вроде:
static int strfind(const char* src, const char* find, int start = 0) < int len = strlen(src); int findlen = strlen(find); for (int i = start; i < len; i++) < if (src[i] == find[0]) < for (int k = i, d = 0; (d > > return -1; > //---Эксклюзивная функция абсолютно не похожая ни на что еще //---Специально для юникода и лично для @Котик_хочет_кушать, ))) static int wcsfind(const wchar_t* src, const wchar_t* find, int start = 0) < int len = wcslen(src); int findlen = wcslen(find); for (int i = start; i < len; i++) < if (src[i] == find[0]) < for (int k = i, d = 0; (d > > return -1; >
Отслеживать
ответ дан 18 июн 2012 в 17:51
636 3 3 серебряных знака 14 14 бронзовых знаков
@lirik90, Чтобы отформатировать код, выделите его мышью и нажмите на кнопку 101010 редактора.
18 июн 2012 в 17:54
По-сути вы предлагаете реализовать парсинг самому. Зачем изобретать велосипед, если с regex это будет значительно быстрее реализовать и проще поддерживать? Про читабельность кода я вообще не говорю.
18 июн 2012 в 17:56
да я догадывался что так бы сделать надо, только никто не предупредил что между текстом и кодом еще и пустую строку оставлять надо(((
18 июн 2012 в 17:56
А что значит проще поддерживать ?=) Если страницу изменят и парсер менять, «реализовать парсер самому», как по мне так это секунд 15 потратить))) в том смысле что быстрее не быстрее это вопрос спорный ИМХО. а код и правда диковатый=)) но работает)
18 июн 2012 в 18:02
Давайте вашему коду скормим что-нибудь следующего содержания, а потом вместе посмеемся: > mortal man from the sphere I can see it can you see ̲͚̖͔̙î̩́t̲͎̩̱͔́̋̀ it is beautiful the final snuffing of the lies of Man ALL IS LOŚ͖̩͇̗̪̏̈́T ALL IS LOST the pon̷y he comes he c̶̮omes he comes the ichor permeates all MY FACE MY FACE ᵒh god no NO NOO̼OO NΘ stop the an*̶͑̾̾̅ͫ͏̙̤g͇̫͛͆̾ͫ̑͆l͖͉̗̩̳̟̍ͫͥͨe̠̅s ͎a̧͈͖r̽̾̈́͒͑e not rè̑ͧ̌aͨl̘̝̙̃ͤ͂̾̆ ZA̡͊͠͝LGΌ ISͮ̂҉̯͈͕̹̘̱ TO͇̹̺ͅƝ̴ȳ̳ TH̘Ë͖́̉ ͠P̯͍̭O̚N̐Y̡ H̸̡̪̯ͨ͊̽̅̾̎Ȩ̬̩̾͛ͪ̈́̀́͘ ̶̧̨̱̹̭̯ͧ̾ͬC̷̙̲̝͖ͭ̏ͥͮ͟Oͮ͏̮̪̝͍M̲̖͊̒ͪͩͬ̚̚͜Ȇ̴̟̟͙̞ͩ͌͝
18 июн 2012 в 21:23
- html
- c++
- синтаксический-анализ
Учимся парсить сайты на C#: часть 1
Данная статья первая из цикла «Парсим сайты на C#». В ней мы научимся непосредственно подключаться к выбранному серверу, скачивать страничку, разбирать её исходный код, а также выводить на экран первоначальный результат. Эта программа только для тестов – для реальной работы я рекомендую использовать готовые библиотеки. Однако даже без библиотек, встроенными средствами NET несложно сделать настоящее приложение — парсер для сайтов самостоятельно.
Итак, начнем мы с того, что научимся получать страничку. В данном случае пациентом выступает рейтинг топ лиру, конкретно страница с адресом «https://www.liveinternet.ru/?upread.ru» — именно в этом ареале в настоящий момент обитает мой блог. Эту страницу мы скачиваем, ищем на ней адрес «upread.ru» (парсим) и выводим место, на котором данный сайт находится. На выходе будет примерно такая картинка.

А вот и сам код программы:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Net; using System.IO; using System.Text.RegularExpressions; namespace ParsLiRu < public partial class Form1 : Form < string url = "https://www.liveinternet.ru/?upread.ru"; public Form1() < InitializeComponent(); >private void button1_Click(object sender, EventArgs e) < backgroundWorker1.RunWorkerAsync(); >private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) < using (WebClient client = new WebClient()) < client.Encoding = System.Text.Encoding.UTF8; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; var htmlData = client.DownloadData(url); string htmlCode = Encoding.UTF8.GetString(htmlData); var parts1 = Regex.Split(htmlCode, "nick=upread.ru\">"); var parts2 = Regex.Split(parts1[1], " "); int numberPosition = Convert.ToInt32(Regex.Replace(parts2[0], @"[^\d]+", "")); this.Invoke(new MethodInvoker(delegate < label1.Text = Convert.ToString("Позиция: " + numberPosition + " Время: " + System.DateTime.Now.ToLongTimeString()); >)); > > > >
Несколько комментариев по коду выше. В строке 32 создаем WebClient; далее 34 — здесь задается кодировка скачиваемой страницы. В строке 35 включаем поддержку защищенного протокола (https). 37-38 – получаем данные страницы и конвертим их в string, учитывая кодировку.
Сам разбор страницы происходит в строках 40-42 – с помощью регулярных выражений убираем все до вхождения подстроки upread.ru, далее получаем второй элемент массива (сплит по коду пробела) и в конце опять же с помощью регулярок оставляем только число.
Вот так мы создали простейший парсер страниц на си шарп. Повторюсь, что для реальной работы лучше использовать готовые библиотеки. Вот например, Как парсить сайты с помощью CsQuery.

Автор этого материала — я — Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML — то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
статьи IT, си шарп, интернет, парсинг
Парсинг сайтов на c#. Часть 1. Использование WebBrowser
Парсинг сайтов — это получение интересующей информации с веб-страниц. Автор попытался сделать пошаговое руководство, начиная с основ парсинга с помощью компонента WebBrowser и заканчивая темами такими как выполнение логина и поддержания сессий через HTTPWebRequest.
Компонент WebBrowser
Этот контрол обеспечивает встроенный полноценный браузер в вашем приложении. Он позволяет пользователю перемещаться по веб-страницам внутри формы.
Пример: WebBrowser Download Event (событие загрузки)
- Добавьте контрол WebBrowser на форму. И выставите свойству Dock значение «Fill»
- Добавьте следующие события и код:
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) < this.Text +=" a"; >private void Form1_Load(object sender, EventArgs e) < webBrowser1.Navigate("http://jobtools.ru"); >

List hist = new List(); private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) < if (hist.Contains(webBrowser1.Url.ToString())) return; this.Text +=" a"; hist.Add(webBrowser1.Url.ToString()); >private void Form1_Load(object sender, EventArgs e) < webBrowser1.Navigate("http://jobtools.ru"); >
Пример: Навигация по сайту
- Перед тем как создавать свой парсер сайтов, кликер-бота и т.п. необходимо разобраться с макетом документа, как искать и находить нужные блоки в документе
- Найдите на странице интересующий вас элемент
- Найдите id этого элемента на странице

HtmlElement he = webBrowser1.Document.GetElementById("menu-item-1469"); HtmlElementCollection hec = he.GetElementsByTagName("a");webBrowser1.Navigate(hec[0].GetAttribute("href"));Пример: Навигация по всем ссылкам на странице
- Для начала мы должны найти и сохранить все ссылки на странице, давайте не все ссылки а только те, что находятся в меню (id=menu-glavnaya). Для этого заведем список из строк, в который будем сохранять все значения атрибута href (сам адрес у ссылки):
List urls = new List();
HtmlElement he = webBrowser1.Document.GetElementById("menu-glavnaya"); HtmlElementCollection hec = he.GetElementsByTagName("a"); foreach (HtmlElement a in hec) < string href = a.GetAttribute("href"); if (href != "http://jobtools.ru") < if (!urls.Contains(href)) urls.Add(href); >>if(urls.Count > 0) < string u = urls[0]; urls.RemoveAt(0); webBrowser1.Navigate(u); this.Text = "Всего ссылок" + urls.Count.ToString(); >else
Пример: Заполняем и отправляем форму входа Yahoo
- Заходим на сайт http://mail.yahoo.com/;
- Находим ID формы ввода логина и пароля;
- Добавляем кнопку на форму и прописываем код в событии onClick
htmlElement hu = webBrowser1.Document.GetElementById("username"); hu.Focus(); hu.SetAttribute("Value","userName"); HtmlElement hp = webBrowser1.Document.GetElementById("passwd"); hp.Focus(); hp.SetAttribute("Value", "password");HtmlElement hf = webBrowser1.Document.GetElementById("login_form"); hf.InvokeMember("submit");Пример: Установка значений для Referrer и User-Agent
webBrowser1.Navigate("url", "_blank", null, "Referrer: sample user agent");Пример: Сохранить все изображения на странице
- Добавьте ссылку using mshtml;
- И используем следующий код, который сохраняет все картинки в папку с программой
IHTMLDocument2 doc = (IHTMLDocument2)webBrowser1.Document.DomDocument; IHTMLControlRange imgRange = (IHTMLControlRange)((HTMLBody)doc.body).createControlRange(); foreach (IHTMLImgElement img in doc.images) < imgRange.add((IHTMLControlElement)img); imgRange.execCommand("Copy", false, null); try< using(Bitmap bmp = (Bitmap)Clipboard.GetDataObject().GetData(DataFormats.Bitmap)) bmp.Save(img.nameProp + ".jpg"); >catch (System.Exception ex) < MessageBox.Show(ex.Message); >>Пример: Разбор капчи используя API DeathByCaptcha
- Подключаем ссылку using DeathByCaptcha;
- Используем следующий код (тут всё просто)
Client client = (Client)new SocketClient(capUser, capPwd); try < Captcha captcha = client.Decode(path + capName, 50); if (null != captcha) < //Captcha Solved MessageBox.Show(captcha.Text); >else < //Captcha Not Solved Show Error Message >> catch(DeathByCaptcha.Exception ex)
Пример: Как задать Proxy для WebServer
using Microsoft.Win32; RegistryKey reg = Registry.CurrentUser.OpenSubKey( "Software\\Microsoft\\Windows\\CurrentVersion\\InternetSettings", true); registry.SetValue("ProxyEnable", 1); registry.SetValue("ProxyServer", "192.168.1.1:9876");8 Replies to “Парсинг сайтов на c#. Часть 1. Использование WebBrowser”
Отличная статья, спасибо пригодилась
Спасибо! Надо добраться до продолжения!
Андрей :Спасибо за статью, пригодилась. Но Вы писали, что можно организовать «…подсчет фреймов на странице совместно с подсчетом количества срабатываний события DocumentCompleted…». Можете описать каким образом это реализовать. Спасибо.
А можете показать пример как парсить статистику сервера с сайта мониторинга по типу Статус Онлайн или в Оффлайн и количество игроков?
Если эта информация выводится на сайте, то это легко, дайте адрес сайта для примера.
Помню в WoW статистику отдавал специальный скрипт на php что ли. Вообщем дайте адрес сайта, а там попробуемgs4u. net/dayzm/217.23.139.34:2302. html пробелы надо убрать
Нужна строчка Статус:Онлайн и строчка играков: 0 из 2//Загружаем страничцу
webBrowser1.Navigate(«http://gs4u.net/dayzm/217.23.139.34:2302.html»); //после загрузки страницы в DocumentCompleted парсим
HtmlElementCollection he = webBrowser1.Document.GetElementsByTagName(«td»);
Label1.Text = he[25].InnerText; выбрали все элементы td на странице, так как в вашем случае id не прописан.
25 элемент td как раз и содержит необходимую Вам информацию. Я перешел на использование php для парсинга страниц, и по сравнению с ним этот вариант в статье очень уж не удобен и ограничен. Быстрее, функциональней делать так как описано в этом примереиспользуя описанные там библиотеки
Добавить комментарий Отменить ответ
Метки
Рубрики
Последние записи
- Использование VFPOLEDB в виде отдельного сервиса WebAPI
- OpenSource проект WebDbfShow
- Как ускорить вставку данных в Excel
- Eloquent в Laravel и название столбца с тире
- Настройка Vue.js в Laravel 6 и старше
Свежие комментарии
- Gerz к записи DBFShow
- Vic58 к записи DBFShow
- Gerz к записи DBFShow
- Alexandr к записи DBFShow
- Gerz к записи DBFShow