  | 
				VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.   
				 | 
			 
		 
		 
	
		| 上一篇主題 :: 下一篇主題   | 
	 
	
	
		| 發表人 | 
		內容 | 
	 
	
		syntech
 
 
  註冊時間: 2003-05-16 文章: 4252 來自: 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('&', 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('&', 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. 想學習系統規劃,想找系統架構的顧問
 
 
請聯絡我們,也許我們幫得上忙 | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		kalok
 
 
  註冊時間: 2010-08-26 文章: 284
 
  第 2 樓
  | 
		
			
				 發表於: 星期三 八月 20, 2014 11:08 am    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				| 謝謝, 研究中 | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		syntech
 
 
  註冊時間: 2003-05-16 文章: 4252 來自: Taipei,Taiwan
  第 3 樓
  | 
		
			
				 發表於: 星期三 八月 20, 2014 2:04 pm    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				"ox.Document.getElementById("ires")"
 
這個是關鍵.
 
 
其他就是字串整理的功夫.
 
 
 
當然你需要一點 HTML5 DOM 的知識. _________________ 如果公司有下列困擾:
 
1. 找不到便宜,快速,簡易的 生產排程軟體
 
2. 不知道如何快速排定 採購計劃
 
3. 成本抓不準,自己算比軟體算有用
 
4. 想學習系統規劃,想找系統架構的顧問
 
 
請聯絡我們,也許我們幫得上忙 | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
  	 
	    
  	   | 
 	
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
  | 
   
  
		 |