| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 435 人关注过本帖
标题:如何根据ISBN去相关网站自动提取书名、作者等信息?
只看楼主 加入收藏
Lusir0756
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2025-2-20
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:7 
如何根据ISBN去相关网站自动提取书名、作者等信息?
家里书很多很多,想一个藏书系统,多年未玩VFP了,请多指教!
2025-02-20 11:51
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2254
专家分:4013
注 册:2007-4-27
收藏
得分:1 
书香门第啊

只求每天有一丁点儿的进步就可以了
2025-02-20 15:05
Lusir0756
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2025-2-20
收藏
得分:0 
没有代码呀,兄台有?

以下是引用wengjl在2025-2-20 15:05:26的发言:

书香门第啊

2025-02-21 09:54
nbwww
Rank: 8Rank: 8
等 级:贵宾
威 望:11
帖 子:345
专家分:835
注 册:2021-1-9
收藏
得分:0 
这是来布置作业的感觉   开个题  剩下的学生去完成

2025-02-21 19:12
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:873
专家分:1357
注 册:2021-10-13
收藏
得分:19 
哈哈,给你段代码提示:

*通过国家数字图书馆的isbn搜索功能来获取书名信息应该是最准的,但是好像该网站设置了防频繁连接的技术,查询函数名经常变换
*网上搜了很多遍,找不到一个合适的查询isbn的网站
*最后想到卖书的当当网站,这个你总不至于不让我查吧?嘿嘿。。。

***getisbninfo.prg

PARAMETERS cisbn

IF PARAMETERS()=0
    cisbn="9787020137473"
ENDIF     

*curl="http://opac.
    "&find_code=ISB&adjacent=Y&x=66&y=16&FIND_BASE=NLC01&filter_request_1=&FIND_BASE=NLC09&filter_code_1=WLN"+;
    "&filter_request_1=&filter_code_2=WYR&filter_request_2=&filter_code_3=WYR&filter_request_3="+;
    "&filter_code_4=WFM&filter_request_4=&filter_code_5=WSL&filter_request_5="
*curl="https://
curl="https://search.
curl=STRTRAN(curl,"ISBN",cisbn)
ohttp=CREATEOBJECT("microsoft.xmlhttp")
ohttp.open("get",curl)
ohttp.send()
WAIT "query data from internet..." WINDOW AT srow()/2,scol()/2 TIMEOUT 3 &&防止还没得到response,就执行下面的程序

cresponse=ohttp.responsetext
i=0
DO WHILE .t.
    i=i+1
    cstr=STREXTRACT(cresponse,"<ul ","</ul>",i)
    IF "作者" $ cstr
        EXIT
    ELSE
        LOOP
    ENDIF
ENDDO
STRTOFILE(cstr,"temp.txt")
MODIFY FILE temp.txt
***提取出版社,书名,作者的部分,自己完成吧。。。
2025-02-22 15:02
Lusir0756
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2025-2-20
收藏(1)
得分:0 
非常感谢 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 进行了优化整理,看起来很专业了。

再次感谢!

2025-02-27 15:57
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:873
专家分:1357
注 册:2021-10-13
收藏
得分:0 
恭喜!

提取中文可以用SUBSTRC( )。
SUBSTRC( ) 是为包含双字节字符的表达式设计的。如果表达式只包含单字节, SUBSTRC() 等同于 SUBSTR()。
2025-02-27 19:41
Lusir0756
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2025-2-20
收藏
得分:0 
回复 7楼 sam_jiang
又学一函数,感谢!
2025-03-01 11:19
快速回复:如何根据ISBN去相关网站自动提取书名、作者等信息?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017473 second(s), 8 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved