VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

把 GOOGLE 搜尋結果轉成TABLE

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
syntech



註冊時間: 2003-05-16
文章: 4211
來自: Taipei,Taiwan

第 1 樓

發表發表於: 星期二 八月 19, 2014 4:41 pm    文章主題: 把 GOOGLE 搜尋結果轉成TABLE 引言回覆

VFP 9 範例
適用於 IE6~IE11

代碼:

CLOSE TABLES ALL
cQuery = URLencode("<< 要查詢的內容 >>")

CSCH="https://www.google.com.tw/search?hl=zh-TW&rlz=1T4VSND_zh-TWTW558TW566&q="+cQuery+"&oq="+cQuery
ox = CREATEOBJECT("InternetExplorer.Application")



&& 判斷ie版本
ox.Navigate("about:blank")
ox.Document.write("<script language=JavaScript>document.write(navigator.userAgent)</script>")

&&  IE 11 拿掉 MSIE 字樣,改成 like Gecko.  IE 6~10 用 MSIE XX 來判斷
cOUTERTEXT = ox.Document.body.outertext
nPos1 = AT('MSIE', cOUTERTEXT )   
IF nPOS1 =0  && 可能是 IE11
      nPos1 = AT('like Gecko', cOUTERTEXT )   
      IF npos1 >0
         nPos1 = AT('rv:', cOUTERTEXT )            
           cOUTERTEXT = SUBSTR(cOUTERTEXT,nPos1)
         nPos1 = AT(')', cOUTERTEXT )            
           cOUTERTEXT = SUBSTR(cOUTERTEXT,1,nPos1-1)
           nVERSION = VAL(ALLTRIM(STRTRAN(cOUTERTEXT,"rv:",'')))
         
      ELSE
         nVERSION = 4.0      &&  無法判斷,先當作 4.0         
      ENDIF
ELSE
        cOUTERTEXT = SUBSTR(cOUTERTEXT,nPos1)
        nPos1 = AT(';', cOUTERTEXT )
        cOUTERTEXT = SUBSTR(cOUTERTEXT,1,nPos1-1)
        nVERSION = VAL(ALLTRIM(STRTRAN(cOUTERTEXT,"MSIE",'')))
       
ENDIF

ox.Navigate(CSCH)
ox.Visible = .T.
DO WHILE ox.ReadyState != 4
*???
   DOEVENTS
ENDDO
*   UNICODE 環境
=SYS(987,.T.)
=SYS(3101,65001)

CREATE CURSOR bookmark1 ( cAddress char(250),cTitle char(250))

oVDiv = ox.Document.getElementById("ires")
cSTr = oVDiv.innerHTML
nLEN = LEN(cSTr)
nOLD_LEN = 0
nCOUNT = 10
DO WHILE !EMPTY(ALLTRIM(cSTr)) AND nLEN != nOLD_LEN
   cstr1= cstr
   cstr2=''

   DO CASE
       Case nVersion = 6 OR nVersion = 7
      
      DO while (AT('<H3 class=r><A href="/url?q=', cSTR ) !=0)
         nPos1 = AT('<H3 class=r><A href="/url?q=', cSTR )
         cstr = SUBSTR(cstr,npos1)
         npos2 = AT('</A></H3>',cstr)
         cstr2 = cstr2+SUBSTR(cstr,1,npos2+9)
         cstr = SUBSTR(cstr,npos2)
      ENDDO

      cstr = cstr2
      cSTR = STRTRAN(cSTR,'<H3 class=r><A href="/url?q=','')

      DO while (AT('&sa=', cSTR ) !=0)
         SELECT bookmark1
         APPEND BLANK
         nPos1 = AT('&amp', cSTR )
         replace   cAddress with   URLdecode(SUBSTR(cSTR,1,npos1-1)+'        ')

         nPos1 = AT('">', cSTR )
         npos2 = AT('</A></H3>',cstr)
         cTitle_STR = SUBSTR(cstr,nPos1+2,npos2-(nPos1+2))
      
         NPOS3 = 0      
         NPOS3 = AT('<',cTitle_STR)
         DO WHILE NPOS3 >0
            NPOS4 = AT('>',cTitle_STR)
            cTitle_STR_A = SUBSTR(cTitle_STR,1,NPOS3-1)
            cTitle_STR_B = SUBSTR(cTitle_STR,NPOS4+1)
            cTitle_STR = cTitle_STR_A+cTitle_STR_B
            NPOS3 = AT('<',cTitle_STR)            
         ENDDO      
      
         replace   cTitle with   cTitle_STR
         cstr = SUBSTR(cstr,npos2+LEN('</A></H3>'))
      ENDDO
       Case nVersion = 8
      
      DO while (AT('<H3 class=r><A href="http://www.google.com.tw/url?url=', cSTR ) !=0)
         nPos1 = AT('<H3 class=r><A href="http://www.google.com.tw/url?url=', cSTR )
         cstr = SUBSTR(cstr,npos1)
         npos2 = AT('</A></H3>',cstr)
         cstr2 = cstr2+SUBSTR(cstr,1,npos2+9)
         cstr = SUBSTR(cstr,npos2)
      ENDDO

      cstr = cstr2
      cSTR = STRTRAN(cSTR,'<H3 class=r><A href="http://www.google.com.tw/url?url=','')

      DO while (AT('&sa=', cSTR ) !=0)
         SELECT bookmark1
         APPEND BLANK
         nPos1 = AT('&amp', cSTR )
         replace   cAddress with   URLdecode(SUBSTR(cSTR,1,npos1-1)+'        ')

         nPos1 = AT('">', cSTR )
         npos2 = AT('</A></H3>',cstr)
         cTitle_STR = SUBSTR(cstr,nPos1+2,npos2-(nPos1+2))
      
         NPOS3 = 0      
         NPOS3 = AT('<',cTitle_STR)
         DO WHILE NPOS3 >0
            NPOS4 = AT('>',cTitle_STR)
            cTitle_STR_A = SUBSTR(cTitle_STR,1,NPOS3-1)
            cTitle_STR_B = SUBSTR(cTitle_STR,NPOS4+1)
            cTitle_STR = cTitle_STR_A+cTitle_STR_B
            NPOS3 = AT('<',cTitle_STR)            
         ENDDO      
      
         replace   cTitle with   cTitle_STR
         cstr = SUBSTR(cstr,npos2+LEN('</A></H3>'))
      ENDDO
      CASE nVersion >= 9
      &&   IE 9 以上
      DO while (AT('<h3 class="r"', cSTR ) !=0)
         nPos1 = AT('<h3 class="r"', cSTR )
         cstr = SUBSTR(cstr,npos1)
         nPos1 = AT('href="', cSTR )
         cstr = SUBSTR(cstr,npos1)
         npos2 = AT('</a></h3>',cstr)
         cstr2 = cstr2+SUBSTR(cstr,1,npos2+LEN('</a></h3>'))
         cstr = SUBSTR(cstr,npos2)
      ENDDO

      cstr = cstr2
      cSTR = STRTRAN(cSTR,'href="','')

      DO while (AT('">', cSTR ) !=0)
         SELECT bookmark1
         APPEND BLANK
         REPLACE   validchk   WITH   'N'
         nPos1 = AT('">', cSTR )
         cADR = SUBSTR(cSTR,1,npos1-1)
         nPOS2 = AT('"',cADR)
         IF nPOS2 >1
            CADR=SUBSTR(CADR,1,NPOS2-1)
         ENDIF
         replace   cAddress with   URLdecode(cADR+'        ')

         nPos1 = AT('">', cSTR )
         npos2 = AT('</a></h3>',cstr)
         cTitle_STR = SUBSTR(cstr,nPos1+2,npos2-(nPos1+2))
      
         NPOS3 = 0      
         NPOS3 = AT('<',cTitle_STR)
         DO WHILE NPOS3 >0
            NPOS4 = AT('>',cTitle_STR)
            cTitle_STR_A = SUBSTR(cTitle_STR,1,NPOS3-1)
            cTitle_STR_B = SUBSTR(cTitle_STR,NPOS4+1)
            cTitle_STR = cTitle_STR_A+cTitle_STR_B
            NPOS3 = AT('<',cTitle_STR)            
         ENDDO
      
         replace   cTitle with   ALLTRIM(cTitle_STR)
         cstr = SUBSTR(cstr,npos2+10)
   
      ENDDO
   OTHERWISE
      *   放棄
   ENDCASE   
   browse
   WAIT TIMEOUT 10
   nOLD_LEN = nLEN
   nCOUNT = nCOUNT +10
   ox.Navigate(CSCH+"&start="+ALLTRIM(STR(nCOUNT))+"&filter=0")
   DO WHILE ox.ReadyState != 4
   *???
      DOEVENTS
   ENDDO    
   oVDiv = ox.Document.getElementById("ires")
   cSTr = oVDiv.innerHTML
   nLEN = LEN(cSTr)
ENDDO

browse
COPY TO c:\bookmark1.dbf
ox.Quit
RELEASE ox
CLOSE TABLES all
=MESSAGEBOX('OK')
RETURN





*   
*-----------------------------------

Function URLdecode
PARAMETER pcInStr
*  ' unencode EVERY %XX
*  ' (keep track of current position so you don't unencode
*  '  a percent that just came out of an URLencoded char
LOCAL I, tStr, tChr, tOut
  tStr = pcInStr
  tOut = ""
  tStr = StrTran(tStr, "+", " ")
  I = 1
  do While I <= Len(tStr)
    If (SubStr(tStr, I, 1) = "%") ;
       And SubStr(tStr, I + 1, 1) $ "0123456789ABCDEF" ;
       And SubStr(tStr, I + 2, 1) $ "0123456789ABCDEF"
      tChr = (( At( SubStr(tStr, I + 1, 1), "0123456789ABCDEF" )-1) * 16 ) ;
           + (( At( SubStr(tStr, I + 2, 1), "0123456789ABCDEF" )-1)      )
      I = I + 2
*03/18/03 Zero's are now allowed.     
      if between(tChr,0,255) && 03/18/03
*      if tChr > 0 and tChr < 255
        tOut = tOut + chr( tChr )
      endif
    else
      tOut = tOut + SubStr(tStr, I, 1)
    EndIf
    I = I + 1
  EndDo
RETURN tOut

**********************************************************
FUNCTION  int2hex (num)
    DECLARE INTEGER wnsprintf IN Shlwapi;
        STRING @lpOut, INTEGER cchLimitIn,;
        STRING pszFmt, INTEGER

    LOCAL lnResult, lcResult
    lcResult = SPACE(20)
    lnResult = wnsprintf(@lcResult, 20, "%x", num)
RETURN Left(lcResult, lnResult)

Function URLencode
PARAMETER pcInStr
*  ' encode Percent signs
*  '        Double Quotes
*  '        CarriageReturn / LineFeeds
LOCAL lcOut, lnI
  lcOut = ''
  for lnI = 1 to len(pcInStr)
    lcCh = Substr(pcInStr,lnI,1)
    if not between( lcCh, chr(33), chr(126) ) ;
       or inlist(lcCh,[+],[%],["],[,],['],[`],[=],[ ],[&])
      lcCh = '%' + PADL( int2Hex( asc(lcCh) ), 2, '0' )
    endif
    lcOut = lcOut + lcCh
  endfor
*!*      lcOut = pcInStr
*!*      lcOut = StrTran(lcOut, "+",  "%2B")
*!*      lcOut = StrTran(lcOut, "%",  "%25")
*!*      lcOut = StrTran(lcOut, '"',  "%22")
*!*      lcOut = StrTran(lcOut, ",",  "%2C")
*!*      lcOut = StrTran(lcOut, Chr(13) + Chr(10), "%0D%0A" )
*!*      lcOut = StrTran(lcOut, Chr(13), "%0D")
*!*      lcOut = StrTran(lcOut, Chr(13), "%0A")
RETURN lcOut

_________________
如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
kalok



註冊時間: 2010-08-26
文章: 284


第 2 樓

發表發表於: 星期三 八月 20, 2014 11:08 am    文章主題: 引言回覆

謝謝, 研究中
回頂端
檢視會員個人資料 發送私人訊息
syntech



註冊時間: 2003-05-16
文章: 4211
來自: Taipei,Taiwan

第 3 樓

發表發表於: 星期三 八月 20, 2014 2:04 pm    文章主題: 引言回覆

"ox.Document.getElementById("ires")"
這個是關鍵.

其他就是字串整理的功夫.


當然你需要一點 HTML5 DOM 的知識.

_________________
如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作