标题: [文本处理] BAT实现网页内容整理 [打印本页]
作者: cjiabing 时间: 2013-5-15 19:31 标题: BAT实现网页内容整理
本帖最后由 cjiabing 于 2013-6-3 20:50 编辑
想从百度贴吧复制点内容,结果发现有好多页,一页一页地复制也麻烦,于是鼓捣下帖子下载和内容整理。下载很简单,关键是整理帖子内容麻烦。想用gawk,无奈不熟悉。只好继续折磨findstr和for。现在问题:
1.各楼层发帖时间包含在其他内容里面,截取数据较长。这个解决也没有什么,只是麻烦点。——基本实现!
2.楼层里面的回复内容是纯粹的文字,不包含网页代码,不好提取。——等待!。。。
3.恢复分行分段。这个也不难,替换<br>即可。——已实现
求助于给位,不管何种方法,只要能实现以上目标即可!注意先后顺序!
以下是百度贴吧帖子内容提取工具.bat,不考虑回复和发帖时间,基本上满足使用。
-
- @echo off&setlocal enabledelayedexpansion
- echo 提取百度贴吧帖子主楼内容,不包括回复和时间。
- echo 输入百度贴吧帖子链接地址下载所有页面。如:http://tieba.baidu.com/p/1111111111
- set /p "input=请输入:"
- echo Start . . .
- for /f %%h in ('copy /z %0 nul') do set crlf=%%h^
-
- for /f "tokens=4,6 delims=/?=" %%a in ("%input%") do (
- if "%%b"=="" (echo ID:%%a ,第 1 页) else echo ID:%%a ,第 %%b 页
- set id=%%a
- cd.>!id!.txt
- wget.exe -q "%input%" -O !id!.txt
- )
- for /f "tokens=2 delims=<>" %%a in ('findstr /i "<title>" !id!.txt') do set "fn=%%a"
- set num=1
- for %%h in ("!crlf!") do (
- for /f "tokens=20 delims=:," %%a in ('findstr /i "all_page_num:" !id!.txt') do (
- echo 文件:!fn!,共 %%a 页
- for /l %%i in (2,1,%%a) do (
- set /a num+=1
- echo 下载:!fn!,第 !num! 页
- cd.>"_!fn!_!num!.txt"&cd.>"!fn!_!num!.txt"
- wget.exe -q "http://tieba.baidu.com/p/!id!?pn=!num!" -O "_!fn!_!num!.txt"
- for /f "tokens=4* delims=<>" %%o in ('findstr /i "post_content_" "_!fn!_!num!.txt"') do (
- if /i "%%o" neq "br" (set "str=%%o %%p") else set "str=%%p"
- set str=!str:^<br^>=%%~h!
- set str=!str:^<br/^>=%%~h!
- set str=!str:br^>=%%~h!
- set str=!str:^<br=%%~h!
- set str=!str:^</div^>=!
- set str=!str:/div^>=!
- set str=!str:^</cc^>=!
- echo;!str!
- echo;
- )>>"!fn!_!num!.txt"
- )&&del /q "_!fn!_!num!.txt"
- ))
- cd.>"!fn!_1.txt"
- for %%h in ("!crlf!") do (
- for /f "tokens=4* delims=<>" %%o in ('findstr /i "post_content_" "!id!.txt"') do (
- if /i "%%o" neq "br" (set "str=%%o %%p") else set "str=%%p"
- set str=!str:^<br^>=%%~h!
- set str=!str:^<br/^>=%%~h!
- set str=!str:br^>=%%~h!
- set str=!str:^<br=%%~h!
- set str=!str:^</div^>=!
- set str=!str:/div^>=!
- set str=!str:^</cc^>=!
- echo;!str!
- echo;
- )>>"!fn!_1.txt"
- )
- del /q "!id!.txt"
- start "" "!fn!_1.txt"
- echo Success.
- 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
替换换行符要像这样:复制代码
作者: terse 时间: 2013-5-26 21:30
本帖最后由 terse 于 2013-5-26 23:23 编辑
回复提取 还是有空的情况- @echo off&setlocal enabledelayedexpansion
- set "url=http://tieba.baidu.com/p/1002111656"
- for /f "tokens=*" %%i in ('wget.exe -q -O- !url! ^| sed -nr "/all_page_num:/s#.*all_page_num:([0-9+]).*#\1#p"') do (
- for /l %%a in (1 1 %%i) do (
- echo 下载 第 %%a 页
- 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/>/>/g;s/</</g;s/\&/\&/g;s/ |<img class=\x22.*>|<a href=\x22.*>//g;s#</div></cc>##gp};/lzl_content_main/{n;s/<br>/\n/g;s/>/>/g;s/</</g;s/\&/\&/g;s#^[\t ]*##;s#</span>##p};{s#.*lzl_time.*>([^<>]*)<.*#回复时间:\1#p}" >"page_num_%%a.txt"
- )
- )
- 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
大多数 还是可处理的- @echo off&setlocal enabledelayedexpansion
- set "url=http://tieba.baidu.com/p/1002111656"
- wget.exe -q -O "url.txt" "%url%"
- for /f "delims=" %%a in ('findstr /i "all_page_num:" url.txt') do (
- set "str=%%a"
- for /f "delims=," %%i in ("!str:*all_page_num:=!") do (
- echo 共 %%i 页
- for /l %%j in (1 1 %%i) do (
- echo 下载 第 %%j 页 到 page_num_%%j.txt
- (for /f "tokens=*" %%b in ('wget.exe -q -O- "!url!?pn=%%j"') do (
- if "%%b" neq "" (
- set str=%%b
- if "!str:"date":=!" neq "%%b" (
- for /f "delims=," %%c in ("!str:*"date":=!") do echo 发帖时间:%%~c
- ) else if "!str:_post_content=!" neq "%%b" (
- for /f "tokens=2* delims=>" %%c in ("%%b") do (
- if "%%d" neq "" set "s=%%d"
- )
- ) else if defined _main (
- if "!str:</span>=!" neq "%%b" (
- set "s=!str:</span>=!"
- set "_main="
- )
- ) else if "!str:lzl_content_main=!" neq "%%b" (
- set _main=%%b
- ) else if "!str:lzl_time=!" neq "%%b" (
- for /f "tokens=2 delims=<>" %%c in ("%%b") do echo 回复时间:%%c
- )
- if defined s (
- set "s=!s: =!"
- set "s=!s:&=&!"
- set "s=!s:>=>!"
- set "s=!s:<=<!"
- set s=!s:^<br^>=^
-
- !
- set "s=!s:</div></cc><br/>=!"
- echo !s!&set "s="
- )
- )
- ))>tem_.t
- more tem_.t >page_num_%%j.txt
- )
- )
- )
- del tem_.t
- pause
复制代码
作者: cjiabing 时间: 2013-6-3 21:25
帮你改了输入、文件名、调整了发帖和回复时间以及其他一些小问题,你看看怎么样!~- @echo off&setlocal enabledelayedexpansion
- Rem 可完整地提取帖子所有内容,包括各楼层跟帖内容和回复内容,以及发帖、回帖时间。
- set /p "url=请输入帖子地址:"
- wget.exe -q -O "url.txt" "%url%"
- for /f "tokens=2 delims=<>" %%a in ('findstr /i "<title>" "url.txt"') do set "fn=%%a"
- for /f "delims=" %%a in ('findstr /i "all_page_num:" url.txt') do (
- set "str=%%a"
- for /f "delims=," %%i in ("!str:*all_page_num:=!") do (
- echo 共 %%i 页
- for /l %%j in (1 1 %%i) do (
- echo 下载 第 %%j 页 到 !fn!_%%j.txt
- (for /f "tokens=*" %%b in ('wget.exe -q -O- "!url!?pn=%%j"') do (
- if "%%b" neq "" (
- set str=%%b
- if "!str:"date":=!" neq "%%b" (
- for /f "delims=," %%c in ("!str:*"date":=!") do echo;&echo 发帖时间:%%~c
- ) else if "!str:_post_content=!" neq "%%b" (
- for /f "tokens=2* delims=>" %%c in ("%%b") do (
- if "%%d" neq "" set "s=%%d"
- )
- ) else if defined _main (
- if "!str:</span>=!" neq "%%b" (
- set "s=!str:</span>=!"
- set "_main="
- )
- ) else if "!str:lzl_content_main=!" neq "%%b" (
- set _main=%%b
- ) else if "!str:lzl_time=!" neq "%%b" (
- for /f "tokens=2 delims=<>" %%c in ("%%b") do echo 回复时间:%%c
- )
- if defined s (
- set "s=!s: =!"
- set "s=!s:&=&!"
- set "s=!s:>=>!"
- set "s=!s:<=<!"
- set s=!s:^<br^>=^
-
- !
- set "s=!s:</div></cc><br/>=!"
- echo;&echo !s!&set "s="
- )
- )
- ))>tem_.t
- more tem_.t >!fn!_%%j.txt
- )
- )
- )
- del tem_.t,url.txt
- 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 |