none
有辦法用WebBrowser抓到網頁上的表格嗎? RRS feed

  • 問題

  • 想要抓的網頁:https://tw.stock.yahoo.com/d/s/earning_2002.html

    想要抓的是下面每月營收變化的表格

    目前是用WebBrowser去讀有table標籤的資料

    可以抓到這些資料:

       

      //開始 ---------------------------

    ---------------------------
    跳至搜尋欄。 是新用戶嗎? 請註冊登入服務說明Download the new Yahoo Mail app信箱拍賣 Yahoo 奇摩 Yahoo 股市 搜尋 網頁搜尋





       --當日個股股價-- --當日個股走勢-- --個股成交明細-- --個股新聞-- --個股健診-- --公司基本資料-- --個股籌碼分析-- --歷史股價K線圖-  2016/07/21 16:35 距離美股開盤還有4小時55分鐘更新

      股票代號/名稱   --當日個股股價-- --當日個股走勢-- --個股成交明細-- --個股新聞-- --個股健診-- --公司基本資料-- --個股籌碼分析-- --歷史股價K線圖-   常見問題 2002中鋼 走勢圖 成交明細 技術分析 新聞 基本資料 籌碼分析 個股健診 新版理財 



    公司資料 營收盈餘  股利政策 申報轉讓









    每 月 營 收 變 化單位: 仟元 

    104 年 度105 年 度

    月營 收年增率月營 收年增率累計營收年增率達成率

    129,403,105-9.01%122,238,128-24.37%22,238,128-24.37%-

    223,583,840-17.42%217,998,083-23.68%40,236,211-24.06%-

    327,816,757-11.81%324,722,332-11.12%64,958,543-19.61%-

    425,352,633-17.58%422,882,766-9.74%87,841,309-17.25%-

    524,191,363-22.00%524,478,9251.19%112,320,234-13.83%-

    624,018,677-20.96%624,971,0173.96%137,291,251-11.06%-

    723,940,466-21.87%7-----

    822,628,370-26.46%8-----

    921,124,844-31.54%9-----

    1021,125,715-31.16%10-----

    1120,302,262-29.58%11-----

    1221,592,504-28.38%12-----
    ---------------------------
    確定   
    ---------------------------


    //結束

    程式碼:

    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;
    
    
    
    namespace WindowsFormsApplication3
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                this.button1.Click += new EventHandler(button1_Click);
                this.web.Navigate(this.textBox1.Text);
                web.ScriptErrorsSuppressed = true;
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                HtmlDocument doc = web.Document;
                try
                {
                    string result = "";
                    HtmlElementCollection table = doc.GetElementsByTagName("center");
                    web.ScriptErrorsSuppressed = true;
                    Application.DoEvents();
                    
                    foreach (HtmlElement element in table)
                    {
                        result += element.OuterText;
                    }
                    //string[] sTemp = result.Split(new string[] { "達成率","%" }, StringSplitOptions.RemoveEmptyEntries);
                    //string[] stemp = sTemp[1].Split('.');
                    MessageBox.Show(result);
                }
                catch (Exception Err)
                {
                    MessageBox.Show(Err.Message.ToString());
                }
            }
            
        }
    }

    然後我有用一個字一個字讀取找自己要的數字,不過出現了一個問題,數字的長短都不一樣,換一個股票的話就無法套用了,有沒有別的方法可以直接抓取想要的表格你面的內容呢?

    還是我要換不一樣的方法來解析這個資料呢??

    謝謝回答><

    --------------------------------------------------------------------------------------------------------------------------------

    感謝各位的回答,新手的問題就是發問太簡略了><我後來用一層一層找的方法,找到了我要的資料,以下是我的程式碼:

    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;
    
    
    
    namespace WindowsFormsApplication3
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                this.button1.Click += new EventHandler(button1_Click);
                this.web.Navigate(this.textBox1.Text);
                web.ScriptErrorsSuppressed = true;
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                HtmlDocument doc = web.Document;
                try
                {
                    string sTemp = doc.GetElementById("description").GetAttribute("content").ToString();
                    string[] split1 = sTemp.Split('(');
                    string[] split2 = split1[0].Split(' ');
                    MessageBox.Show(split2[2]);
    
                    HtmlElementCollection table = doc.GetElementsByTagName("table");
                    web.ScriptErrorsSuppressed = true;
                    Application.DoEvents();
                    int iN = 0;
                    for (int intA = table.Count - 1; intA >= 0; intA--)
                    {
                        if (table[intA].OuterHtml.Contains("營 收")) iN = intA;
                    }
                    double [] iFinal1 = new double[12];
                    double[] iFinal2 = new double[12];
                    HtmlElementCollection table2 = table[iN].GetElementsByTagName("tr");
                    HtmlElementCollection table3 = table2[3].GetElementsByTagName("td");
                    string[] sA;
                    string[] sB;
                    string sa = "";
                    string sb = "";
                    for (int intA = 0; intA < 12; intA++)
                    {
                        sA = table3[9 * intA + 16].InnerText.ToString().Split(',');
                        sB = table3[9 * intA + 19].InnerText.ToString().Split(',');
                        sa = "";
                        sb = "";
                        //MessageBox.Show(table3[9 * intA + 16].InnerText.ToString());
                        //MessageBox.Show(table3[9 * intA + 16 + 3].InnerText.ToString());
                        for (int intB = 0; intB < sA.Length; intB++)
                        {
                            sa += sA[intB];
                        }
                        for (int intB = 0; intB < sB.Length; intB++)
                        {
                            sb += sB[intB];
                        }
    
                        if (!double.TryParse(table3[9 * intA + 16].InnerText.ToString(), out iFinal1[intA]))
                        {
                            iFinal1[intA] = 0;
                        }
                        if (!double.TryParse(table3[9 * intA + 19].InnerText.ToString(), out iFinal2[intA]))
                        {
                            iFinal2[intA] = 0;
                        }
                    }
    
                    string s = "";
                    for (int intA = 0; intA < 12; intA++)
                    {
                        s += iFinal1[intA] + "," + iFinal2[intA] + ",";
                    }
                    MessageBox.Show(s);
                }
                catch (Exception Err)
                {
                    MessageBox.Show(Err.Message.ToString());
                }
            }
            
        }
    }
    

    感謝提供擴充元件方法的大大還有讓我使用"Regular Expression"去爬的大大,我其實只是想知道解析的方法QQ但是沒問清楚,所以讓解答有了無限的可能TAT

    不使用上面兩個方法是因為我是個小新手,想要用自己了解的方法使用,不過還是感謝提供解決方法的大大們,有空之餘我也會來嘗試這方法的。

    • 已編輯 MayDing 2016年7月25日 上午 06:27 遞交解答
    2016年7月21日 上午 03:54

解答

所有回覆

  • 您可以參考這個範例抓取網頁顯示的資料:

    Screen-Scraping Stock Market Data with HtmlAgilityPack

    2016年7月21日 上午 04:12
  • 先感謝回答

    我爬文的時候也有看到很多用"HtmlAgilityPack"的文章

    但是我不想使用擴充元件,如果不使用的話,有沒有好的方法可以抓到每個月的盈餘呢??

    2016年7月21日 上午 08:33
  • 不想用擴充套件,就自己寫 Regular Expression 一個一個爬吧。

    例如:http://stackoverflow.com/questions/16005413/using-regex-to-get-text-between-multiple-html-tags


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2016年7月21日 上午 08:42
    版主
  • 不想使用擴充元件可以自行解析HTML文件的內容, 這樣做不會比較簡單, 如果網頁有指定語系和編碼會更麻煩, 所以如果不想擴充元件, 還是有方法, 但是稱不上是好的方法了
    2016年7月22日 上午 02:10