none
請教「抽取網頁內容」的作法

    問題

  • 請教各位先進,當我今天需要從網頁中抽取一段內容時,該如何作呢(從原始碼中抽取,我已經把網頁轉換成代碼了) ?

    並且此過程不希望被使用者干預,即不希望使用者在抽取內容後,能擅自更改數據。

    <我使用的是 C# 2008>

    舉個例子:

     

    某網頁上有此段文字

    onlines  31

    請問我該如何抽取出那一個31呢 ?

     

    站1代碼如下
    <TD width="50%">onlines</TD>
    <TD>31</TD>

    站2代碼如下
    <TR>
    <TH class=descripcion>Web Stats</TH>
    <TH>&nbsp;</TH></TR>
    <TR>
    <TD class=descripcion># onlines</TD>
    <TD>31</TD></TR>

     

    請教各位先進,應用哪些函式或控件呢?

    或是該去哪裡找尋資料?

    謝謝了!!

    2008年10月5日 上午 09:42

解答

  • 我覺得最簡單的方法就是使用 Regex。不過除非你已經很熟 Regular Expression, 否則它有一定程度的進入門檻 (你可以參考「[Regex] Regular Expression 詳論」)。

     

    不過, 若要這麼做, 得先有個前題, 那就是目標文字必須有明確且固定的規則, 例如一定是 online 123 這種表示法, 不能臨時變成 current users: 32 之類的。首先, 使用 Regex.Replace(你抓下來的網頁片段, "<.+>", String.Empty) 把所有 HTML tag 清空, 然後使用 online\s*(?<Onlines>\d+) 當作表示式, 就可以取到 "Onlines" 這個 Regex 裡面的 group 了, 這個就是你所要的。

    2008年10月6日 上午 01:04
  • [Regex] Regular Expression 詳論」是給初學者看的, 講的比較簡單。你如果有時間的話, 可以看看 Wikipedia 上的介紹

     

    網路上有太多例子可以找, 恕我無法一一解釋。我建議你如果要練習的話, 可以上 RegExLib.com 試試身手, 或者去下載 Expresso (可以參考「[Regex] 超讚!免費的 Regular Expression 輔助編輯與測試工具」一文的介紹)。

     

    在 .NET 環境中, 你只需要使用 \s 就可以代表空白字元了, 不需要使用 \V。[0-9] 也可以以 \d 代表。此外, 如果你照我所說的把所有 HTML TAG 都先刪掉, 就不用再加上 <TD> 之類的東西了。

     

    我已經說過, Regex 有一定的進入門檻, 如果你企圖在網路上用問的問到學會的話, 那是不可能的。不是廣告, 不過我覺得你可以去翻翻 70-536 教材這一本書 (如果你想看得懂, 最好是看原文版本), 裡面對 Regex 的介紹還算詳細。

    2008年10月8日 上午 09:59

所有回覆

  • 我覺得最簡單的方法就是使用 Regex。不過除非你已經很熟 Regular Expression, 否則它有一定程度的進入門檻 (你可以參考「[Regex] Regular Expression 詳論」)。

     

    不過, 若要這麼做, 得先有個前題, 那就是目標文字必須有明確且固定的規則, 例如一定是 online 123 這種表示法, 不能臨時變成 current users: 32 之類的。首先, 使用 Regex.Replace(你抓下來的網頁片段, "<.+>", String.Empty) 把所有 HTML tag 清空, 然後使用 online\s*(?<Onlines>\d+) 當作表示式, 就可以取到 "Onlines" 這個 Regex 裡面的 group 了, 這個就是你所要的。

    2008年10月6日 上午 01:04
  •  Johnny.Net 寫信:

    我覺得最簡單的方法就是使用 Regex。不過除非你已經很熟 Regular Expression, 否則它有一定程度的進入門檻 (你可以參考「[Regex] Regular Expression 詳論」)。

     

    不過, 若要這麼做, 得先有個前題, 那就是目標文字必須有明確且固定的規則, 例如一定是 online 123 這種表示法, 不能臨時變成 current users: 32 之類的。首先, 使用 Regex.Replace(你抓下來的網頁片段, "<.+>", String.Empty) 把所有 HTML tag 清空, 然後使用 online\s*(?<Onlines>\d+) 當作表示式, 就可以取到 "Onlines" 這個 Regex 裡面的 group 了, 這個就是你所要的。

     

    太感謝您了!

    感覺好像有點摸到了,不過有個小疑問,

    為甚麼主題會被分類到ASP.NET 呢 ?

     

    也謝謝您給的「[Regex] Regular Expression 詳論」)。

    很有收穫!

    先去實做看看代碼

    若有問題在上此主題向高手請益了!

    2008年10月6日 上午 11:12
  • "<TD class=descripcion># onlines<\\/TD>[\r\n]+<TD>([0-9]+)<\\/TD>"

     

    我在網路上看到了這樣的例子

    其中 onlines後的規則看不太懂

    用您的「[Regex] Regular Expression 詳論」比對,發現很多規則好像都不太一樣,

    不知道能請您解釋一下這段代碼麼?

    2008年10月8日 上午 09:38
  • [Regex] Regular Expression 詳論」是給初學者看的, 講的比較簡單。你如果有時間的話, 可以看看 Wikipedia 上的介紹

     

    網路上有太多例子可以找, 恕我無法一一解釋。我建議你如果要練習的話, 可以上 RegExLib.com 試試身手, 或者去下載 Expresso (可以參考「[Regex] 超讚!免費的 Regular Expression 輔助編輯與測試工具」一文的介紹)。

     

    在 .NET 環境中, 你只需要使用 \s 就可以代表空白字元了, 不需要使用 \V。[0-9] 也可以以 \d 代表。此外, 如果你照我所說的把所有 HTML TAG 都先刪掉, 就不用再加上 <TD> 之類的東西了。

     

    我已經說過, Regex 有一定的進入門檻, 如果你企圖在網路上用問的問到學會的話, 那是不可能的。不是廣告, 不過我覺得你可以去翻翻 70-536 教材這一本書 (如果你想看得懂, 最好是看原文版本), 裡面對 Regex 的介紹還算詳細。

    2008年10月8日 上午 09:59