Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.07.2012, 16:27   #1
ForzaMetall
 
Регистрация: 29.07.2012
Сообщений: 7
По умолчанию парсинг или нет

Здравствуйте!Помогите!
Задача
сайт - http://www.057.ua/dosug/446
нужно взять информацию о кафе и барах с первой по последнюю страницы
Название,адрес,телефон и вывести в ричбокс с последующим сохранением в csv.
все что я самостоятельно смог осилить проект в архиве
Огромное пожалуйста)
Вложения
Тип файла: rar FormParser.rar (58.4 Кб, 11 просмотров)
ForzaMetall вне форума Ответить с цитированием
Старый 29.07.2012, 22:32   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

я бы забил на ручной парсинг а применил бы HTMLAgility, довольно просто выходит.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 30.07.2012, 00:25   #3
ForzaMetall
 
Регистрация: 29.07.2012
Сообщений: 7
По умолчанию

то что я навоял , первая кнопка - качается одна страничка,сохраняется и выводится в ричтекстбокс,вторая кнопка для редактирования(вытягивания нужной инфы)
Код:
 private void BStart_Click(object sender, EventArgs e)
        {
            
            WebRequest webReq = WebRequest.Create("http://www.057.ua/dosug/446");
            WebResponse webRes = webReq.GetResponse();
            Stream st = webRes.GetResponseStream();
            StreamReader sr = new StreamReader(st);
            StreamWriter sw = new StreamWriter(@"E:\Projects\Projects 2\FormParser\1.html");
            string response = sr.ReadToEnd();
            sw.WriteLine(response);
            sr.Close();
            sw.Close();
            richTextBox1.Text = File.ReadAllText(@"E:\Projects\Projects 2\FormParser\1.html");
        }

        private void Bremove_Click(object sender, EventArgs e)
        {
            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.Load(@"E:\Projects\Projects 2\FormParser\1.html");

        }
Что нужно,что бы качались все 8 страниц и сохранялись в файл для последующей обработки(или как качать не сохраняя,а сразу обрабатывать вытаскивать нужную инфу и только потом сохранять и выводить в ричтекстбокс?)
Как именно вытащить нужную инфу?
вот кусок странички с нужной инфой(обведена красным)
Если у вас есть время и желание помочь,можете дополнить мой код до рабочего состояния с оментариями,что бы я мог видя живой рабочий код конретно по моему примеру брать и изучать.
Изображения
Тип файла: jpg 22222.jpg (225.8 Кб, 122 просмотров)
Вложения
Тип файла: rar FormParser1.rar (201.7 Кб, 10 просмотров)
ForzaMetall вне форума Ответить с цитированием
Старый 30.07.2012, 01:57   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
или как качать не сохраняя
Код:
string response = sr.ReadToEnd();
вот тут у вас полный текст страницы, его можно передать в
Код:
HtmlDocument.LoadHtml(response);
c HtmlAgility сам код(HTML всмысле) вам не столь важен, важна иерархия обьектов и их черты(это мелочь по сравнению с листанием всего кода).
а далее посмотрите на XPath, можно взять коллекцию всего что нужно сразу и через foreach обработать(а так же выбрать линк на след страницу, если есть).

приме не могу пока дать, тока студию снес, но если не выйдет постараюсь завтра.

а иерархию хорошо видно в отладчиках у браузеров.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 30.07.2012 в 02:01.
Пепел Феникса вне форума Ответить с цитированием
Старый 30.07.2012, 04:32   #5
ProX_Alex
Пользователь
 
Регистрация: 06.04.2012
Сообщений: 29
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
Код:
string response = sr.ReadToEnd();
вот тут у вас полный текст страницы, его можно передать в
Код:
HtmlDocument.LoadHtml(response);
c HtmlAgility сам код(HTML всмысле) вам не столь важен, важна иерархия обьектов и их черты(это мелочь по сравнению с листанием всего кода).
а далее посмотрите на XPath, можно взять коллекцию всего что нужно сразу и через foreach обработать(а так же выбрать линк на след страницу, если есть).

приме не могу пока дать, тока студию снес, но если не выйдет постараюсь завтра.

а иерархию хорошо видно в отладчиках у браузеров.

Вот кодик

Код:
var doc = new HtmlAgilityPack.HtmlDocument();
            WebRequest reqGET = System.Net.WebRequest.Create("http://www.057.ua/dosug/446");
            System.Net.WebResponse resp = reqGET.GetResponse();
            Stream stream = resp.GetResponseStream();
            StreamReader sr = new StreamReader(stream, Encoding.GetEncoding(65001));
            string s = sr.ReadToEnd();
            doc.LoadHtml(s);
            HtmlNodeCollection Names = doc.DocumentNode.SelectNodes(@".//*[@id='all_body']/table/tr/td[2]/table/tr/td/h2/a");
            HtmlNodeCollection streetsandphone = doc.DocumentNode.SelectNodes(@".//*[@id='all_body']/table/tr/td[2]/table/tr/td/strong");

            List<string> itognames = new List<string>();
            List<string> itogphones = new List<string>();

            if (Names != null)
            {
                int i = 0;
                foreach (HtmlNode c in Names)
                {
                    itognames.Add(c.InnerText);
                }
                foreach (HtmlNode d in streetsandphone)
                {
                    itogphones.Add(d.InnerText);
                }

            }
ProX_Alex вне форума Ответить с цитированием
Старый 30.07.2012, 08:16   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

одно но, я бы советовал сначало привязаться к блоку содержащую обе нужные инфы, а уже от него искать конкретно, чтоб было меньше SelectNodes.
хотя это моя привычка конечно.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 30.07.2012, 14:27   #7
ForzaMetall
 
Регистрация: 29.07.2012
Сообщений: 7
По умолчанию

Спасибо!Буду пробовать использовать ваш код.
Вопрос - он работает со всеми страничками или только с первой?
как вывести полученную отредактированную инфу в ричтекстбокс и потом сохранить в csv у меня не получается засунуть отредактированные данные в один файл и с ним работать(

Последний раз редактировалось ForzaMetall; 30.07.2012 в 15:50.
ForzaMetall вне форума Ответить с цитированием
Старый 30.07.2012, 16:08   #8
ForzaMetall
 
Регистрация: 29.07.2012
Сообщений: 7
По умолчанию

Код - берет только первую страницу и выбирает названия и описания
Код:
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net;
using System.Threading;
using System.Text.RegularExpressions;

namespace WFParser
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void buttonGo_Click(object sender, EventArgs e)
        {
             var wc = new WebClient();
            wc.Encoding = Encoding.UTF8;
            String fp = wc.DownloadString("http://www.057.ua/dosug/446");
            if (!String.IsNullOrEmpty(fp))
            {
                var titlesMatch = Regex.Matches(fp,"<h2>[^<]*<a\\s+href=\"([^\"]+)\"[^>]+title=\"([^\"]+)\"",RegexOptions.IgnoreCase | RegexOptions.Compiled);
                var maxPage = Regex.Match(fp,"<a href=\"[^\"]+/(\\d+)\">\\1</a>[^<]+<\\!\\-\\-");
                if (titlesMatch.Count > 0)
                {
                    String titles="";
                    foreach(Match titleMatch in titlesMatch){
                        titles += titleMatch.Groups[1].Value + " => " + WebUtility.HtmlDecode(titleMatch.Groups[2].Value.Trim()) + "\n";
                    }
                    //MessageBox.Show("Загаловки: \n\n"+titles);
                    richTextBox1.Text = titles.ToString(); 
                }
           
            }
        

        }
    }
}
Что дописать что бы брало из всех страниц и +адреса и телефоны?
Огромное вам спасибо.
ForzaMetall вне форума Ответить с цитированием
Старый 30.07.2012, 16:29   #9
ProX_Alex
Пользователь
 
Регистрация: 06.04.2012
Сообщений: 29
По умолчанию

Цитата:
Сообщение от ForzaMetall Посмотреть сообщение
Код - берет только первую страницу и выбирает названия и описания
Код:
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net;
using System.Threading;
using System.Text.RegularExpressions;

namespace WFParser
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void buttonGo_Click(object sender, EventArgs e)
        {
             var wc = new WebClient();
            wc.Encoding = Encoding.UTF8;
            String fp = wc.DownloadString("http://www.057.ua/dosug/446");
            if (!String.IsNullOrEmpty(fp))
            {
                var titlesMatch = Regex.Matches(fp,"<h2>[^<]*<a\\s+href=\"([^\"]+)\"[^>]+title=\"([^\"]+)\"",RegexOptions.IgnoreCase | RegexOptions.Compiled);
                var maxPage = Regex.Match(fp,"<a href=\"[^\"]+/(\\d+)\">\\1</a>[^<]+<\\!\\-\\-");
                if (titlesMatch.Count > 0)
                {
                    String titles="";
                    foreach(Match titleMatch in titlesMatch){
                        titles += titleMatch.Groups[1].Value + " => " + WebUtility.HtmlDecode(titleMatch.Groups[2].Value.Trim()) + "\n";
                    }
                    //MessageBox.Show("Загаловки: \n\n"+titles);
                    richTextBox1.Text = titles.ToString(); 
                }
           
            }
        

        }
    }
}
Что дописать что бы брало из всех страниц и +адреса и телефоны?
Огромное вам спасибо.
Вот вам всё регулярки нужны эти... Пустите свой код по циклу фор где i бедут равно от 1 до 8 включительно и подставляйте в адрес:
String fp = wc.DownloadString("http://www.057.ua/dosug/446/" + i);
ProX_Alex вне форума Ответить с цитированием
Старый 30.07.2012, 17:23   #10
ForzaMetall
 
Регистрация: 29.07.2012
Сообщений: 7
По умолчанию

ProX_Alex,спасибо вам,помогите еще чуть чуть:
что дописать что бы показывало в ричтекстбоксе - itognames + itogphones и также записывало в csv.
Заранее благодарен!
Код:
 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net;
using System.Threading;
using HtmlAgilityPack;
namespace FormParserWorked_Version
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i <= 8; i++)
            {
                var doc = new HtmlAgilityPack.HtmlDocument();
                WebRequest reqGET = System.Net.WebRequest.Create("http://www.057.ua/dosug/446");
                System.Net.WebResponse resp = reqGET.GetResponse();
                Stream stream = resp.GetResponseStream();
                StreamReader sr = new StreamReader(stream, Encoding.GetEncoding(65001));
                string s = sr.ReadToEnd();
                doc.LoadHtml(s);
                HtmlNodeCollection Names = doc.DocumentNode.SelectNodes(@".//*[@id='all_body']/table/tr/td[2]/table/tr/td/h2/a");
                HtmlNodeCollection streetsandphone = doc.DocumentNode.SelectNodes(@".//*[@id='all_body']/table/tr/td[2]/table/tr/td/strong");

                List<string> itognames = new List<string>();
                List<string> itogphones = new List<string>();

                if (Names != null)
                {
                    int j = 0;
                    foreach (HtmlNode c in Names)
                    {
                        itognames.Add(c.InnerText);
                    }
                    foreach (HtmlNode d in streetsandphone)
                    {
                        itogphones.Add(d.InnerText);
                    }
                }
            }

        }
    }
}

Последний раз редактировалось ForzaMetall; 30.07.2012 в 20:02.
ForzaMetall вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Да или нет? Andrey770 Паскаль, Turbo Pascal, PascalABC.NET 1 16.03.2011 11:49
Парсинг PHP или... Dionix Общие вопросы Delphi 5 10.07.2010 22:16
верно или нет? s2dentishe Помощь студентам 2 28.04.2010 21:29
Правда или нет? profi Свободное общение 13 27.01.2010 08:39
Правильно или нет вот в чём вопрос но ошибок нет... Alexcool Помощь студентам 2 10.01.2010 13:55