非常感谢 sam_jiang 先生!!
很多推荐 豆瓣API,又说各种限制。
根据兄台启发,从当当入手,写了一段代码,简单且符合要求。
以下是完整代码:
*** VFP9 根据 ISBN 提取图书信息
*** getisbinfo.prg
Set Safety Off
Clear All
Clear
* 测试 ISBN 列表
LOCAL ARRAY aISBNs[7]
aISBNs[1] = "9787100207867"
aISBNs[2] = "9787010252865"
aISBNs[3] = "9787229177072"
aISBNs[4] = "9787545461312"
aISBNs[5] = "9787520712545"
aISBNs[6] = "9787308236287"
aISBNs[7] = "9787010222936"
* 主程序
FOR EACH cisbn IN aISBNs
ProcessISBN(cisbn)
ENDFOR
PROCEDURE ProcessISBN(cISBN)
* 构造请求URL
LOCAL curl, ohttp, cResponse
curl = "https://search. + cisbn + "&act=input"
* 发送HTTP请求
ohttp = CREATEOBJECT("Microsoft.XMLHTTP")
ohttp.Open("GET", curl, .F.)
ohttp.Send()
cResponse = ohttp.ResponseText
* 提取信息块
LOCAL cBookInfoBlock
cBookInfoBlock = ExtractInfoBlock(cResponse)
IF EMPTY(cBookInfoBlock)
? "ISBN: " + cisbn + " 未找到图书信息"
RETURN
ENDIF
* 提取图书信息
LOCAL cBookName, cAuthor, cPublisher
cBookName = ExtractChinese(cBookInfoBlock, AT("a title=", cBookInfoBlock))
cAuthor = ExtractChinese(cBookInfoBlock, AT("作者", cBookInfoBlock) + 4)
cPublisher = ExtractPublisher(cBookInfoBlock)
* 合并输出结果
? GetFormattedInfo(cISBN, cBookName, cAuthor, cPublisher)
ENDPROC
FUNCTION ExtractInfoBlock(cResponse)
LOCAL i AS Integer, cBlock AS String
FOR i = 1 TO 300
cBlock = STREXTRACT(cResponse, "<ul ", "</ul>", i)
IF "a title" $ cBlock
RETURN cBlock
ENDIF
ENDFOR
RETURN ""
ENDFUNC
FUNCTION ExtractChinese(cStr, nStartPos)
LOCAL cResult AS String, i AS Integer
cResult = ""
IF nStartPos < 1
RETURN ""
ENDIF
FOR i = nStartPos TO LEN(cStr)
IF ASC(SUBSTR(cStr, i, 1)) > 127
&& 汉字
cResult = cResult + SUBSTR(cStr, i, 2) && 取2字节
i = i + 1
ELSE
IF NOT EMPTY(cResult)
EXIT
ENDIF
ENDIF
ENDFOR
RETURN STRTRAN(cResult, "'", "") && 清理单引号
ENDFUNC
FUNCTION ExtractPublisher(cStr)
LOCAL xx AS String, nStartPos AS Integer
xx = IIF(AT("dd_name='出版社' title='", cStr) > 0,;
"dd_name='出版社' title='",;
"单品出版社' title=")
nStartPos = AT(xx, cStr) + LEN(xx)
RETURN ExtractChinese(cStr, nStartPos)
ENDFUNC
FUNCTION GetFormattedInfo
LPARAMETERS cISBN, cName, cAuthor, cPub
RETURN "ISBN: " + cISBN + CHR(13) + ;
"图书信息: " + cName + " | " + cAuthor + " | " + cPub
ENDFUNC
实际中还需要增加一些判断,写交个差~~~~
后经 Deepseek 进行了优化整理,看起来很专业了。
再次感谢!