Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Парсинг конкретная задача


Автор: ForzaMetall 29.7.2012, 16:20
Здравствуйте!Помогите!
Задача
сайт - http://www.057.ua/dosug/446
нужно взять информацию о кафе и барах с первой по последнюю страницы
Название,адрес,телефон и вывести в ричбокс с последующим сохранением в csv.
все что я самостоятельно смог осилить проект в архиве
Помогите пожалуйста!

Автор: Тигер 29.7.2012, 19:05
Вам помогут 
System.Net.WebClient  - для загрузки страницы (используйте метод DownloadString)
System.Text.RegularExpressions.Regex - для парсинга (тут правда нужно немного разобраться с регулярными выражениями, но оно того стоит. В msdn довольно понятная дока)

В CSV можно сохранить с помощью обычного StreamWriter'а
в Excel разделитель строк - перенос строки "\n", столбцов - точка с запятой ";"


Автор: ForzaMetall 29.7.2012, 20:19
Спасибо,почитаю.
Дело в том что я учусь и это для меня первое серьезное  задание.Очень многое непонятно и большая часть задания мне пока не ясна.Если бы вы могли дополнить мой код с комментариями или переделать его.... Ну 1000 спасибо) 

Автор: Тигер 29.7.2012, 21:03
Да я сам с  C# третий день только )
ну вам впринципе, нужно разобраться только с регулярками, наверное это самый простой способ парсинга. Но в любом случае, разбирать Html не самая тривиальная задача и требует "покопаться" в самом коде страницы, может я попозже посмотрю (или кто-то из форумчан) но у меня сейчас свои непонятки...

Автор: crz 29.7.2012, 21:18
Разбирать html при помощи регулярных выражений - плохая идея. Лучше воспользоваться библиотекой http://htmlagilitypack.codeplex.com/ и с ее помощью делать xpath запросы к html коду.

Автор: ForzaMetall 29.7.2012, 21:22
до этого задания я писал только -калькулятор и записную книгу.Представления о том что сейчас нужно делать для реализации этого задания практически не имею,за исключением того что сейчас читаю и пытаюсь понять и попробовать.Если бы вы могли дополнить мой код с комментариями или переделать его до рабочего состояния что бы я мог отталкиваясь от комментариев и видя живой рабочий код мог искать нужную инфу,сопоставлять с готовым кодом и на основе этого строить в голове и на деле реальные знания и понимание того что я делаю.Если у вас будет время и желание помочь,буду безмерно благодарен.мне к концу недели нужно сделать.

Автор: ForzaMetall 29.7.2012, 22:45
то что я навоял , качается одна страничка,сохраняется и выводится в ричтекстбокс
Код

  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 страниц и сохранялись в файл для последующей обработки(или как качать не сохраняя,а сразу обрабатывать вытаскивать нужную инфу и только потом сохранять и выводить в ричтекстбокс?)
Как иjavascript:emo_pop();менно вытащить нужную инфу?
вот кусок странички с нужной инфой(обведена красным)
     http://s014.radikal.ru/i328/1207/a4/740b72cedccb.jpg

Автор: Тигер 29.7.2012, 23:09
Цитата

Разбирать html при помощи регулярных выражений - плохая идея.

Разбирать HTML - плохая, а вот грабить контент из HTML - самое то  smile 

Мне в вашем коде немного лень разбираться, но вот небольшой пример как вытащить ссылки => загаловки и последнюю страницу

Код

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.Net;
using System.IO;
using System.Threading;
using System.Text.RegularExpressions;

namespace FormParser
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void BStart_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);
                }
                if (maxPage.Success)
                {
                    MessageBox.Show("Последняя страница: "+maxPage.Groups[1].Value);
                }
            }
        }

        private void Bremove_Click(object sender, EventArgs e)
        {

        }

        private void bSave_Click(object sender, EventArgs e)
        {

        }

    }
}


Автор: ForzaMetall 30.7.2012, 13:33
Огромное спасибо буду разбираться!
Вопрос -инфа берется с 1й и последней странички в этом коде?Или только с 1й,а последняя просто показывается?Я не понял (

Автор: ForzaMetall 30.7.2012, 18:58
Код

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)
        {
            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);
                    }
                }
           
            }


что дописать что бы показывало в ричтекстбоксе - itognames + itogphones и также записывало в csv.
Заранее благодарен!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)