Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
Kir@
88 / 56 / 7
Регистрация: 07.02.2010
Сообщений: 684
1

Распарсить HTML страницу

05.09.2014, 10:56. Просмотров 2022. Ответов 34
Метки нет (Все метки)

Здрям!

На форме будут размещен элемент webBrowser и через него буду открывать страницу.
Код страницы выглядит так:
HTML5
1
2
3
4
<tr>
                    <td style="width:190px;">Сокращенное наименование:</td>
                    <td>ЗАО " А.Р.Т. "</td>
                </tr>
Мне надо получить, например, вот этот текст ЗАО " А.Р.Т. ".
Помогите, пожалуйста с кодом.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.09.2014, 10:56
Ответы с готовыми решениями:

Распарсить HTML-страницу
например я Напишу страницу в техбох1 а при нажатие на кнопки спарсить он...

Распарсить полученую html страницу
ссылка: http://soft.softodrom.ru/ap/Traffic-Inspector-p4360 Написал метод...

Распарсить локальную HTML-страницу
Привет ! Я вот только начинаю знакомство с языком C#.. Хочу спросить у вас, с...

Html Agility Pack: распарсить страницу - C#
Три дня не могу распарсить таблицу списка файлов на сайте rutracker.org....

Html Agility Pack: распарсить страницу
Имеется HTML код &lt;tr&gt; &lt;td class=&quot;&quot;&gt; Побед: &lt;/td&gt; ...

34
Milky___Way
Заблокирован
05.09.2014, 11:17 2
Это полный код страницы? Сомневаюсь. Полный будет как минимум такой
HTML5
1
2
3
4
<html><head></head><body><tr>
                    <td style="width:190px;">Сокращенное наименование:</td>
                    <td>ЗАО " А.Р.Т. "</td>
                </tr></body></html>
Добавлено через 15 секунд
Покажите полный код. А лучше ссылку киньте
0
Kir@
88 / 56 / 7
Регистрация: 07.02.2010
Сообщений: 684
05.09.2014, 11:50  [ТС] 3
Полный не могу:
Вы ввели слишком длинный текст (113193 символов). Пожалуйста, сократите его до 10000 символов.

Со страницей я буду работать на самой форме, т.к. доступ на сайт только по паролю. Любой запрос из вне тут же вызывает вопрос "логин/пасс?"

Страницу тоже сохранить не могу - при сохранении теряется вся информация.
0
Ev_Hyper
Заблокирован
05.09.2014, 11:53 4
Kir@, прикрепите файлом и скажите из каких тегов вам нужно выбрать информацию.
0
Kir@
88 / 56 / 7
Регистрация: 07.02.2010
Сообщений: 684
05.09.2014, 12:00  [ТС] 5
Код сохранил в doc. Мне надо пример на одном параметре, чтобы потом другие выдергивать (их много).
Так что из тегов первого поста.
0
Вложения
Тип файла: 7z исходный код.7z (419.6 Кб, 12 просмотров)
Kir@
88 / 56 / 7
Регистрация: 07.02.2010
Сообщений: 684
08.09.2014, 09:17  [ТС] 6
Ладно, попробуем изменить алгоритм:
1. копирую текст в textbox;
2. склеиваю все строки в одну, наверное, вот этим:
C#
1
string lines = string.Join(Environment.NewLine, richTextBox1.Lines);
3. Ищу текст
HTML5
1
Сокращенное наименование:</td>
4. Копирую следующее за ним выражение
HTML5
1
<td>ЗАО " А.Р.Т. "</td>
5. Обрезаю все теги.

Норм? Как реализовать пункты 3 и 4?
0
oazis
Заблокирован
08.09.2014, 10:36 7
IndexOf() и Substring().
А вообще, такие вещи регулярками делаются. Или с помощью HtmlAgilityPack.
0
Ev_Hyper
Заблокирован
08.09.2014, 10:49 8
Kir@, конкретизируйте задачу, тогда можно будет и код написать. Если только эти две фразы, то проще регулярками, наверное. А если таких td много - то HtmlAgilityPack
0
Kir@
88 / 56 / 7
Регистрация: 07.02.2010
Сообщений: 684
08.09.2014, 11:06  [ТС] 9
Ev_Hyper, конкретизирую
Среди over 2500 строк html кода найти значение
HTML5
1
<td style="width:190px;">Сокращенное наименование:</td>
, которое в данном случае равно
HTML5
1
<td>ЗАО " А.Р.Т. "</td>
и скопировать его в буфер обмена.
0
xoraxax
1342 / 1284 / 378
Регистрация: 05.07.2013
Сообщений: 6,163
Завершенные тесты: 1
08.09.2014, 11:22 10
регуляркой и не париться
Сокращенное наименование:</td>\n<td>(.*?)</td>
0
Ev_Hyper
Заблокирован
08.09.2014, 11:26 11
Kir@, как вариант:

C#
1
2
3
4
5
            string str = File.ReadAllText(@"D:/2.txt");
            string text = "Сокращенное наименование:";
            var xc = str.IndexOf(text);
            var pp = Regex.Match(str.Substring(xc, text.Length + 200), "<td>(.*)</td>");
            Console.WriteLine(pp.Groups[1]);
Код
ЗАО " СИБАГРОПРОМСТРОЙ "
Для продолжения нажмите любую клавишу . . .
200 - предпологаемая максимальная длина наименования. Если она неизвестна, то можно её вообще убрать:
C#
1
var pp = Regex.Match(str.Substring(xc), "<td>(.*)</td>");
1
Kir@
88 / 56 / 7
Регистрация: 07.02.2010
Сообщений: 684
08.09.2014, 11:37  [ТС] 12
Ev_Hyper, спасибо, буду пробовать.
0
karaulov6
23 / 23 / 6
Регистрация: 23.03.2013
Сообщений: 243
Завершенные тесты: 2
08.09.2014, 12:13 13
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.Net;
using System.IO;
using System.Runtime.InteropServices;
...
 
    class Program
    {
        //Это что бы в консоль можно было вставлять текст правой кнопкой мыши - [начало]
 
        [DllImport( "kernel32.dll" )]
        static extern bool SetConsoleMode ( IntPtr hConsoleHandle , uint dwMode );
 
 
 
        [DllImport( "kernel32.dll" )]
        static extern IntPtr GetStdHandle ( int handle );
 
 
 
        static void УстановитьРежимВставки()
        {
            IntPtr handle = GetStdHandle( -10 );
            uint flags = ( uint ) ( 0x0080 | 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 );
            SetConsoleMode( handle , flags );
        }
        //Это что бы в консоль можно было вставлять текст правой кнопкой мыши - [конец]
 
 
        static string Скачать_страницу ( string url , int timeout , IWebProxy proxy )
        {
          if ( url.ToLower().IndexOf("htt") == -1 &&url.ToLower().IndexOf("www") == -1 )
            {
                if (File.Exists(url))
                {
                    return File.ReadAllText( url );
                }
                else
                {
                    return url;
                }
 
            }
            try
            {
                StreamReader _Answer = null;
                HttpWebRequest WebReq = ( HttpWebRequest ) WebRequest.Create( url );
                WebReq.Method = "GET";
                WebReq.Referer = url;
                WebReq.UserAgent = "Opera/9.80 (Windows NT 6.1) Presto/2.12.388";
                WebReq.Proxy = proxy;
                WebReq.Timeout = timeout;
                WebReq.CookieContainer = new CookieContainer( );
                HttpWebResponse WebResp = ( HttpWebResponse ) WebReq.GetResponse( );
                Stream Answer = WebResp.GetResponseStream( );
                _Answer = new StreamReader( Answer );
                string ответ = _Answer.ReadToEnd( );
                Console.WriteLine( "Размер:" + ответ.Length );
                return ответ;
            }
            catch
            {
                ;
            }
            return String.Empty;
        }
 
 
 
        static void Main ( string [ ] args )
        {
            УстановитьРежимВставки( );
            Console.WriteLine( "Введите адресс страницы:" );
            string адрес = Console.ReadLine( );
            string ТекстСтраницы = Скачать_страницу( адрес , 5000 , WebRequest.GetSystemWebProxy( ) );
            if ( ТекстСтраницы.Length > 10 )
            {
 
 
                ТекстСтраницы = ТекстСтраницы.Remove( 0 , ТекстСтраницы.IndexOf( "CompanyInformationPadding" ) );
 
 
                string регекс = @">\s*\wокращенное.*?:.*?<.*?<td>(.*?)<";
                Regex получить_с_имя = new Regex( регекс , RegexOptions.Singleline );
 
                int id = 0;
 
                foreach ( Match совпадение in получить_с_имя.Matches( ТекстСтраницы ) )
                {
                    if ( совпадение.Success )
                    {
                        id++;
                        Console.WriteLine( "Имя №" + id + ":" + совпадение.Groups [ 1 ].Value );
                    }
                }
                Console.WriteLine( "Поиск завершен" );
            }
            else
            {
                Console.WriteLine( "Ошибка" );
            }
            Console.ReadLine( );
            Console.ReadLine( );
        }
    }
...
Вот у меня так работает, только дай адрес страницы на которой проверить можно)))

Добавлено через 8 минут
я проверял на hттp://slivmail.com/horohordin/message/2421
1
Kir@
88 / 56 / 7
Регистрация: 07.02.2010
Сообщений: 684
09.09.2014, 06:16  [ТС] 14
karaulov6, спасибо за очень подробный ответ.
/ Ev_Hyper, как вот теперь текст получить? )
0
Миниатюры
Распарсить HTML страницу  
Ev_Hyper
Заблокирован
09.09.2014, 08:21 15
Kir@, вместо Console.WriteLine() http://www.cyberforum.ru/cgi-bin/latex.cgi?\rightarrow MessageBox.Show()
C#
1
MessageBox.Show(ShortNameS.Groups[1]);
0
Kir@
88 / 56 / 7
Регистрация: 07.02.2010
Сообщений: 684
09.09.2014, 08:44  [ТС] 16
Ev_Hyper, то же самое: преобразование в string не проходит.
0
Миниатюры
Распарсить HTML страницу  
xoraxax
1342 / 1284 / 378
Регистрация: 05.07.2013
Сообщений: 6,163
Завершенные тесты: 1
09.09.2014, 08:59 17
MSDN:
Можно определить, найден ли шаблон регулярного выражения во входной строке, путем проверки значения свойства Success возвращаемого объекта Match. Если обнаружено соответствие, свойство Value возвращаемого объекта Match содержит подстроку из input, совпадающую с регулярным выражением. Если совпадения не найдены, его значение равно String.Empty.
1
Ev_Hyper
Заблокирован
09.09.2014, 08:59 18
Лучший ответ Сообщение было отмечено Kir@ как решение

Решение

Kir@,
C#
1
2
3
                
MessageBox.Show(pp.Groups[1].Value);
MessageBox.Show(pp.Groups[1].ToString());
2
Kir@
88 / 56 / 7
Регистрация: 07.02.2010
Сообщений: 684
09.09.2014, 12:22  [ТС] 19
Опять затык

HTML5
1
2
3
4
<tr>
<td style="white-space:nowrap;">ИНН:</td>
<td align="left"  >2463045820</td>
</tr>
C#
1
2
3
4
 string text2 = "ИНН";
var inn = str.IndexOf(text2);
var inns = Regex.Match(str.Substring(inn, text2.Length + 100), "<td>(.*)</td>");
MessageBox.Show(inns.Groups[1].ToString());
Выводит ничего.

HTML5
1
2
3
4
5
<td style="width:190px;">Руководитель:</td>
<td>
                        Иванов Иван Иваныч
                         - генеральный директор <span style='color:Grey;'>(Росстат)</span>
</td>
C#
1
2
3
4
string text11 = "Руководитель:";
var boss = str.IndexOf(text11);
var bossS = Regex.Match(str.Substring(boss), "<td*>(.*)<span style='color:Grey;'>(Росстат)</span></td>");
BOSS.Text = (bossS.Groups[1].ToString());
Выводит текстовый бред, который расположен 200 строчками ниже.
0
Ev_Hyper
Заблокирован
09.09.2014, 17:27 20
Цитата Сообщение от Kir@ Посмотреть сообщение
Выводит ничего.
Kir@, нужно немного изменить регулярное выражение:
C#
1
Regex.Match(str.Substring(xc), "<td.+>(.*)</td>");
1
09.09.2014, 17:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2014, 17:27

Составление регулярных выражений. Распарсить HTML-страницу
Всем доброго времени суток! Этой темы касаюсь впервые, а так как опыта...

Распарсить страницу через Html Agility Pack
Имеется страница с разметкой такого Типа : &lt;span id='1_46' class='tree1_1'...

Распарсить HTML страницу для получения теста между тегами
Собственно проблема заключается в том что не получается спарсить текст между...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru