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