baitang36 发表于 2022-12-11 12:56:34

lisp板块精华帖链接抓取试验(附件lsp源码)

本帖最后由 baitang36 于 2022-12-12 08:34 编辑

做了个抓取精华网页的试验,附件是试验结果。
lsp源码在acad2018下调试通过
syz-find-str1函数的用法:
(syz-find-str1 开始位置 大字符串 小字符串);返回小字符串在大字符串中的位置,开头从1开始计数


(defun syz-find-str1 (start1 dstr1 sstr2 / tempstr fstart1 fstart2)
(setq dsize (strlen dstr1))
(setq ssize (strlen sstr2))
(setq fstart1 start1)
(while (< fstart1 (- dsize ssize))
    (setq tempstr (substr dstr1 fstart1 ssize))
    (if        (equal tempstr sstr2)
      (progn
        (setq fstart2 fstart1)
        (setq fstart1 (- dsize ssize))
        fstart2
      ) ;_ progn
      (setq fstart1 (+ 1 fstart1))
    ) ;_ if
) ;_ while
) ;_ defun





                                       



Dani1988 发表于 2022-12-11 13:27:09

下载收藏,需要再看

自贡黄明儒 发表于 2022-12-11 13:44:40

EH上网抓的很多,我也去抓了一回。本论坛除风之影抓取有道翻译外,网抓的很少。给楼主点赞,希望看到更多的网抓。

caoliu023 发表于 2022-12-11 14:04:27

我写抓小说的时候,抓过几次小说,然后给站长发现了,然后有几个小说网站我就访问不了了

baitang36 发表于 2022-12-11 14:08:38

caoliu023 发表于 2022-12-11 14:04
我写抓小说的时候,抓过几次小说,然后给站长发现了,然后有几个小说网站我就访问不了了
你抓的太狠了,影响到网站运行了。站长认为你的电脑带毒了,就屏蔽你的ip了

wowan1314 发表于 2022-12-11 23:34:44

收藏一下,万一有用呢!感谢分享

baitang36 发表于 2022-12-12 08:29:29

本帖最后由 baitang36 于 2022-12-12 08:35 编辑

wowan1314 发表于 2022-12-11 23:34
收藏一下,万一有用呢!感谢分享
唯一有用的就是从一个大字符串中找出一个小字符串位置的函数syz-find-str1
用法:(syz-find-str1 开始位置 大字符串 小字符串)返回小字符串在大字符串中的位置,开头从1开始计数

czb203 发表于 2022-12-13 10:12:45


下载收藏,需要再看

llsheng_73 发表于 2022-12-13 10:59:57

本帖最后由 llsheng_73 于 2022-12-13 15:57 编辑

这样查找字符串的话,双字节字符会出现问题,
原因是因为双字节字符可能会被从高位和低位拆开
(VL-STRING->LIST"汉字测试")
(186 186 215 214 178 226 202 212)
(vl-list->string'(214 178 226 202))
"植馐"
结果会导致(SYZ-FIND-STR1 1"汉字测试""植馐")返回4
个人觉得应该先把字符串分解成单字符表,然后从表中查找,才能避免此类尴尬,不清楚高版本下有没此类尴尬

(defun explodestr(str / ac);;
(setq a(vl-string->list str))
(while a
    (if(<(car a)129)(setq c(cons(chr(car a))c)a(cdr a))
      (setq c(cons(strcat(chr(car a))(chr(cadr a)))c)a(cddr a))))
(reverse c))

(defun tt(n l1 l2 fuz / a i f m);;;从大表中指定位置开始找小表首次出现的位置
(repeat n(setq l1(cdr l1)))
(setq a(car l2)m(length l2))
(while(and(not f)(setq i(vl-position a l1)))
    (setq f(vl-every(function(lambda(x y)(setq l1(cdr l1))(equal x y fuz)))l2(repeat i(setq l1(cdr l1))))
          n(+ i n m)))
(if f(- n m)))
(defun find-str(start dstr1 sstr2 / l1 n )
(if(setq l1(explodestr dstr1)n 0 start(tt start l1(explodestr sstr2)0))
    (repeat start(setq n(+(strlen(car l1))n)l1(cdr l1))))
n)

(FIND-STR 1"汉字测试""植馐")nil
(FIND-STR 1"汉字测试""测试")4






页: [1]
查看完整版本: lisp板块精华帖链接抓取试验(附件lsp源码)