Board logo

标题: [文本处理] BAT实现网页内容整理 [打印本页]

作者: cjiabing    时间: 2013-5-15 19:31     标题: BAT实现网页内容整理

本帖最后由 cjiabing 于 2013-6-3 20:50 编辑

想从百度贴吧复制点内容,结果发现有好多页,一页一页地复制也麻烦,于是鼓捣下帖子下载和内容整理。下载很简单,关键是整理帖子内容麻烦。想用gawk,无奈不熟悉。只好继续折磨findstr和for。现在问题:
1.各楼层发帖时间包含在其他内容里面,截取数据较长。这个解决也没有什么,只是麻烦点。——基本实现!
2.楼层里面的回复内容是纯粹的文字,不包含网页代码,不好提取。——等待!。。。
3.恢复分行分段。这个也不难,替换<br>即可。——已实现


求助于给位,不管何种方法,只要能实现以上目标即可!注意先后顺序!
以下是百度贴吧帖子内容提取工具.bat,不考虑回复和发帖时间,基本上满足使用。


  1. @echo off&setlocal enabledelayedexpansion
  2. echo 提取百度贴吧帖子主楼内容,不包括回复和时间。
  3. echo 输入百度贴吧帖子链接地址下载所有页面。如:http://tieba.baidu.com/p/1111111111
  4. set /p "input=请输入:"
  5. echo Start . . .
  6. for /f %%h in ('copy /z %0 nul') do set crlf=%%h^
  7. for /f "tokens=4,6 delims=/?=" %%a in ("%input%") do (
  8.     if "%%b"=="" (echo ID:%%a ,第 1 页) else echo ID:%%a ,第 %%b 页
  9.     set id=%%a
  10.     cd.>!id!.txt
  11.     wget.exe -q "%input%" -O !id!.txt
  12. )
  13. for /f "tokens=2 delims=<>" %%a in ('findstr /i "<title>" !id!.txt') do set "fn=%%a"
  14. set num=1
  15. for %%h in ("!crlf!") do (
  16. for /f "tokens=20 delims=:," %%a in ('findstr /i "all_page_num:" !id!.txt') do (
  17.     echo 文件:!fn!,共 %%a 页
  18.     for /l %%i in (2,1,%%a) do (
  19.         set /a num+=1
  20.         echo 下载:!fn!,第 !num! 页
  21.         cd.>"_!fn!_!num!.txt"&cd.>"!fn!_!num!.txt"
  22.         wget.exe -q "http://tieba.baidu.com/p/!id!?pn=!num!" -O "_!fn!_!num!.txt"
  23.         for /f "tokens=4* delims=<>" %%o in ('findstr /i "post_content_" "_!fn!_!num!.txt"') do (
  24.             if /i "%%o" neq "br" (set "str=%%o %%p") else set "str=%%p"
  25.             set str=!str:^<br^>=%%~h!
  26.             set str=!str:^<br/^>=%%~h!
  27.             set str=!str:br^>=%%~h!
  28.             set str=!str:^<br=%%~h!
  29.             set str=!str:^</div^>=!
  30.             set str=!str:/div^>=!
  31.             set str=!str:^</cc^>=!
  32.             echo;!str!
  33.             echo;
  34.         )>>"!fn!_!num!.txt"
  35.     )&&del /q "_!fn!_!num!.txt"
  36. ))
  37. cd.>"!fn!_1.txt"
  38. for %%h in ("!crlf!") do (
  39.         for /f "tokens=4* delims=<>" %%o in ('findstr /i "post_content_" "!id!.txt"') do (
  40.             if /i "%%o" neq "br" (set "str=%%o %%p") else set "str=%%p"
  41.             set str=!str:^<br^>=%%~h!
  42.             set str=!str:^<br/^>=%%~h!
  43.             set str=!str:br^>=%%~h!
  44.             set str=!str:^<br=%%~h!
  45.             set str=!str:^</div^>=!
  46.             set str=!str:/div^>=!
  47.             set str=!str:^</cc^>=!
  48.             echo;!str!
  49.             echo;
  50.         )>>"!fn!_1.txt"
  51. )
  52. del /q "!id!.txt"
  53. start "" "!fn!_1.txt"
  54. echo Success.
  55. exit
复制代码

参考CrLf 的旧帖,修改下换行符的获取方式就可以了,不打算精简,能用就行。
http://www.bathome.net/viewthread.php?tid=19751

下一步提取发帖时间和回复帖内容。
作者: cjiabing    时间: 2013-5-15 22:22

大家可以用“批处理贴吧”的这个帖子为例(哈哈,这样做也蛮搞笑的啊!~!!~):
【教程】批处理基础 http://tieba.baidu.com/p/1002111656
用上面提供的代码下载页面,然后把帖子内容、回复、时间提取出来,按顺序哦!
作者: terse    时间: 2013-5-26 14:50

允许三方的话 貌似 SED 可以
作者: CrLf    时间: 2013-5-26 17:05

替换换行符要像这样:
  1. set str=!str:^<br/^>=^
  2. !
复制代码

作者: terse    时间: 2013-5-26 21:30

本帖最后由 terse 于 2013-5-26 23:23 编辑

回复提取 还是有空的情况
  1. @echo off&setlocal enabledelayedexpansion
  2. set "url=http://tieba.baidu.com/p/1002111656"
  3. for /f "tokens=*" %%i in ('wget.exe -q -O- !url! ^| sed -nr "/all_page_num:/s#.*all_page_num:([0-9+]).*#\1#p"') do (
  4.     for /l %%a in (1 1 %%i) do (
  5.         echo 下载 第 %%a 页
  6.         wget.exe -q -O- "!url!?pn=%%a"|sed -nr "{s/.*\x22date\x22:\x22([^\x22]*).*/发帖时间\1/p;s/.*_post_content\x22>(.*)<.*/\1/;s/<br>/\n/g;s/&gt;/>/g;s/&lt;/</g;s/\&amp;/\&/g;s/&nbsp;|<img class=\x22.*>|<a href=\x22.*>//g;s#</div></cc>##gp};/lzl_content_main/{n;s/<br>/\n/g;s/&gt;/>/g;s/&lt;/</g;s/\&amp;/\&/g;s#^[\t ]*##;s#</span>##p};{s#.*lzl_time.*>([^<>]*)<.*#回复时间:\1#p}" >"page_num_%%a.txt"
  7.     )
  8. )
  9. pause
复制代码

作者: cjiabing    时间: 2013-5-26 21:59

回复 4# CrLf


    我的写法和你的一样呢,独立出来运行是可以的,放在其他FOR里面就失效了!@
作者: cjiabing    时间: 2013-5-26 22:00

回复 5# terse


    刚刚试了下,只有一个空的page_num_1.txt,没成功!~你再试试!
作者: terse    时间: 2013-5-26 23:21

回复  terse
    刚刚试了下,只有一个空的page_num_1.txt,没成功!~你再试试!
cjiabing 发表于 2013-5-26 22:00

什么情况啊 循环可以过吗?
我这边测试 可以的
检查一下 提取回复内容 没有处理特殊字符 修正下
作者: CrLf    时间: 2013-5-26 23:35

回复 6# cjiabing


    ! 符号是否位于行首
作者: cjiabing    时间: 2013-6-3 20:20

回复 8# terse


    还是不得,我换了地址也不得,还是空白的!~
作者: cjiabing    时间: 2013-6-3 20:21

回复 9# CrLf


    位于行首也没得,我重新修改下!~
作者: terse    时间: 2013-6-3 20:54

大多数 还是可处理的
  1. @echo off&setlocal enabledelayedexpansion
  2. set "url=http://tieba.baidu.com/p/1002111656"
  3. wget.exe -q -O "url.txt" "%url%"
  4. for /f "delims=" %%a in ('findstr /i "all_page_num:" url.txt') do (
  5.     set "str=%%a"
  6.     for /f "delims=," %%i in ("!str:*all_page_num:=!") do (
  7.         echo 共 %%i 页
  8.         for /l %%j in (1 1 %%i) do (
  9.             echo 下载 第 %%j 页 到 page_num_%%j.txt
  10.             (for /f "tokens=*" %%b in ('wget.exe -q -O- "!url!?pn=%%j"') do (
  11.                 if "%%b" neq "" (
  12.                    set str=%%b
  13.                    if "!str:"date":=!" neq "%%b" (
  14.                       for /f "delims=," %%c in ("!str:*"date":=!") do echo 发帖时间:%%~c
  15.                    ) else if "!str:_post_content=!" neq "%%b" (
  16.                           for /f "tokens=2* delims=>" %%c in ("%%b") do (
  17.                               if "%%d" neq "" set "s=%%d"
  18.                           )
  19.                           ) else if defined _main (
  20.                                  if "!str:</span>=!" neq "%%b" (
  21.                                     set "s=!str:</span>=!"
  22.                                     set "_main="
  23.                                  )
  24.                           ) else if "!str:lzl_content_main=!" neq "%%b" (
  25.                                  set _main=%%b
  26.                                 ) else if "!str:lzl_time=!" neq "%%b" (
  27.                                        for /f "tokens=2 delims=<>" %%c in ("%%b") do echo 回复时间:%%c
  28.                                 )
  29.                     if defined s (
  30.                        set "s=!s:&nbsp;=!"
  31.                        set "s=!s:&amp;=&!"
  32.                        set "s=!s:&gt;=>!"
  33.                        set "s=!s:&lt;=<!"
  34.                        set s=!s:^<br^>=^
  35. !
  36.                        set "s=!s:</div></cc><br/>=!"
  37.                        echo !s!&set "s="
  38.                     )
  39.                 )
  40.             ))>tem_.t
  41.             more tem_.t >page_num_%%j.txt
  42.         )
  43.     )
  44. )
  45. del tem_.t
  46. pause
复制代码

作者: cjiabing    时间: 2013-6-3 21:25

帮你改了输入、文件名、调整了发帖和回复时间以及其他一些小问题,你看看怎么样!~
  1. @echo off&setlocal enabledelayedexpansion
  2. Rem 可完整地提取帖子所有内容,包括各楼层跟帖内容和回复内容,以及发帖、回帖时间。
  3. set /p "url=请输入帖子地址:"
  4. wget.exe -q -O "url.txt" "%url%"
  5. for /f "tokens=2 delims=<>" %%a in ('findstr /i "<title>" "url.txt"') do set "fn=%%a"
  6. for /f "delims=" %%a in ('findstr /i "all_page_num:" url.txt') do (
  7.     set "str=%%a"
  8.     for /f "delims=," %%i in ("!str:*all_page_num:=!") do (
  9.         echo 共 %%i 页
  10.         for /l %%j in (1 1 %%i) do (
  11.             echo 下载 第 %%j 页 到 !fn!_%%j.txt
  12.             (for /f "tokens=*" %%b in ('wget.exe -q -O- "!url!?pn=%%j"') do (
  13.                 if "%%b" neq "" (
  14.                    set str=%%b
  15.                    if "!str:"date":=!" neq "%%b" (
  16.                       for /f "delims=," %%c in ("!str:*"date":=!") do echo;&echo 发帖时间:%%~c
  17.                    ) else if "!str:_post_content=!" neq "%%b" (
  18.                           for /f "tokens=2* delims=>" %%c in ("%%b") do (
  19.                               if "%%d" neq "" set "s=%%d"
  20.                           )
  21.                           ) else if defined _main (
  22.                                  if "!str:</span>=!" neq "%%b" (
  23.                                     set "s=!str:</span>=!"
  24.                                     set "_main="
  25.                                  )
  26.                           ) else if "!str:lzl_content_main=!" neq "%%b" (
  27.                                  set _main=%%b
  28.                                 ) else if "!str:lzl_time=!" neq "%%b" (
  29.                                        for /f "tokens=2 delims=<>" %%c in ("%%b") do echo 回复时间:%%c
  30.                                 )
  31.                     if defined s (
  32.                        set "s=!s:&nbsp;=!"
  33.                        set "s=!s:&amp;=&!"
  34.                        set "s=!s:&gt;=>!"
  35.                        set "s=!s:&lt;=<!"
  36.                        set s=!s:^<br^>=^
  37. !
  38.                        set "s=!s:</div></cc><br/>=!"
  39.                        echo;&echo !s!&set "s="
  40.                     )
  41.                 )
  42.             ))>tem_.t
  43.             more tem_.t >!fn!_%%j.txt
  44.         )
  45.     )
  46. )
  47. del tem_.t,url.txt
  48. start "" !fn!_1.txt
复制代码

作者: terse    时间: 2013-6-3 21:46

有表情图片链接有待处理 另也有字符编码的小问题
能处理大多数了
作者: cjiabing    时间: 2013-6-3 21:50

回复 14# terse


    呵呵,是啊,基本满足需要了!~再整整更完美!~
作者: cjiabing    时间: 2014-1-18 01:42

回复 13# cjiabing


    似乎百度贴吧更新代码了,以前写的东西失效了。问题主要出在提取内容这里。麻烦各位再动手了,第三方也行,只要能用!~




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2