标题: [问题求助] (已结贴)求助大神,抓取html指定内容并输出(不限语言,欢迎各种脚本大神) [打印本页]
作者: heiben 时间: 2014-11-27 17:06 标题: (已结贴)求助大神,抓取html指定内容并输出(不限语言,欢迎各种脚本大神)
本帖最后由 heiben 于 2014-11-28 20:34 编辑
要求是抓取一个目录下的所有html的指定内容,并将其按照格式输出(txt,xls)
在淘宝上找人代写,结果有人说可以,有人不行。
详细要求:
html样本与最终结果放在云盘
http://yunpan.cn/cAXcBy2N7Ij6H 提取码 7b4e
求大神帮助,自己用java写了一些如下:
用Python的Beautiful soup应该更快解决,抓取复制代码
这一部分的内容就可将检查点的大部分都抓取了,但难点就在如何连同基线项,等级与检查点等都关联上。。结果只要不合规的,也就是打红色交叉
的。
最终结果的输出要与excel的相同。- import java.io.BufferedReader;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.io.OutputStreamWriter;
- import java.io.PrintWriter;
- import java.net.URL;
- import java.net.URLConnection;
- import java.util.regex.*;
- public class Test {
-
- public static void main(String[] args) {
- try {
- URL url = new URL("http://127.0.0.1/html/10.248.1.68(80).html");
- URLConnection conn = url.openConnection();
- conn.setDoOutput(true);
- InputStream in = null;
- in = url.openStream();
- String content = pipe(in,"utf-8");
- //System.out.println(content);
- String Regex=">IP地址</th><td>(.*?)</td></tr>(.*?)>安全评估分</th><td>(.*?)</td></tr>(.*?)src=\"images/blank.gif\"(.*?)</td><td colspan='1' rowspan='1' width='40px'>(.*?)</td><td colspan='1' rowspan='1' width='40px'>(.*?)</td><td colspan='1' rowspan='1' width='30px'>(.*?)</th><td colspan='1' rowspan='1' width='150px'>(.*?)</td><td>(.*?)";
- String html=content;
-
- Pattern p1=Pattern.compile(Regex);
-
- Matcher m=p1.matcher(html);
-
- while(m.find())
- {
- //System.out.println(m.group());
- System.out.println("IP地址:"+m.group(1)+"\r\n检查分:"+m.group(3)+"\r\n基线项:"+m.group(5)+"\r\n风险等级:"+m.group(7)+"\r\n检查点:"+m.group(9));
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- static String pipe(InputStream in,String charset) throws IOException {
- StringBuffer s = new StringBuffer();
- if(charset==null||"".equals(charset)){
- charset="utf-8";
- }
- String rLine = null;
- BufferedReader bReader = new BufferedReader(new InputStreamReader(in,charset));
- PrintWriter pw = null;
-
- FileOutputStream fo = new FileOutputStream("test.html");
- OutputStreamWriter writer = new OutputStreamWriter(fo, "utf-8");
- pw = new PrintWriter(writer);
- while ( (rLine = bReader.readLine()) != null) {
- String tmp_rLine = rLine;
- int str_len = tmp_rLine.length();
- if (str_len > 0) {
- s.append(tmp_rLine);
- pw.println(tmp_rLine);
- pw.flush();
- }
- tmp_rLine = null;
- }
- in.close();
- pw.close();
- return s.toString();
- }
- }
复制代码
作者: DAIC 时间: 2014-11-27 17:34
你后来出于什么原因没有找淘宝上说“可以”的人代写?
作者: heiben 时间: 2014-11-27 20:43
回复 2# DAIC
。。。500块人民币。。我还不如先自己试试,或者问问大神们的意见再说说看。。如果有大神可以解决,我300人民币给他
作者: ads350668398 时间: 2014-11-27 22:38
淘宝上面都是骗子 需要解释的话 骂人了
作者: tmplinshi 时间: 2014-11-28 05:02
本帖最后由 tmplinshi 于 2014-11-28 05:06 编辑
用 AutoHotkey 写了下。加我 QQ 1316882711 详谈。
下载地址: http://pan.baidu.com/s/1sjJOVQt
源码:
;-----------------------------------------
/*
[config]
ahk_version=Unicode
icon=
bin=
*/
;@Ahk2Exe-SetVersion 1.0.0.0
;-----------------------------------------
#NoEnv
#NoTrayIcon
#SingleInstance Force
SetWorkingDir %A_ScriptDir%
SetBatchLines -1
ListLines Off
gui_title := "提取评估报告 v1.00"
; 命令行参数
;
If 1 in /?,-h,--help
{
MsgBox, % "用法: " A_ScriptName " [-dir html目录] [-o 输出文件]"
ExitApp
}
arg := ParamToObj()
arg.o := (arg.o = "") ? "评估报告_最终结果.xls" : arg.o
; 开始提取
;
FinalResult := "序号 IP地址 操作系统 检查分数 主机是否达标 基线项 风险等级 检查点 实际值 标准值 配置方法 结果`r`n"
global indexCount := 0
SetWorkingDir, % arg.dir
Loop, *.html
{
ExtractInfo(A_LoopFileFullPath, result)
FinalResult .= result
}
; 保存结果
FileOpen(arg.o, "w").Write(FinalResult)
MsgBox, 处理完毕!
Return
; ==============================================================================================
ExtractInfo(HtmlFile, ByRef ResultTable) {
ResultTable := ""
; 以 UTF-8 编码读取 html 文件内容
FileRead, data, % "*P65001 " HtmlFile
; 提取 IP地址、操作系统、检查分数
RegExMatch(data, "i)IP地址</th><td>(.*?)<.*?配置模板</th><td>(\w+).*?安全评估分</th><td>(.*?)<", m)
devInfo := m1 A_Tab m2 A_Tab m3 A_Tab ( m3>=95 ? "达标" : "不达标" )
; 将搜索范围缩小至“2.检查结果”
RegExMatch(data, "2\.检查结果</div>.*?3\.辅助信息检查结果</div>", data)
; 取得所有红色的“基线项”的出现位置
posList := [], startPos := 1
s := "<tr class='unaccord'><td colspan='1' rowspan='1' width='100px'>"
While, pos := InStr(data, s,, startPos)
startPos := pos + StrLen(s), posList.Insert(startPos)
; 取得每个红色“基线项”下面的红色信息
For i, startPos in posList
{
endPos := (i = posList.MaxIndex()) ? StrLen(data) : posList[i+1]
subData := SubStr(data, startPos, endPos-startPos)
; 获取“基线项”和“风险等级”
RegExMatch(subData, "i)/blank\.gif.*?<td>(.*?)</td><.*?>(.*?)</td>", m)
baseInfo := m1 A_Tab m2
; 获取“检查点”...
_pos := 1, _m := ""
_regEx := "i)<tr class='unaccord'><td>(.*?)</td><td>(.*?)</td><td>.*?<td>(.*?)</td><td>(.*?)</td>"
While, _pos := RegExMatch( subData, _regEx, _m, _pos+StrLen(_m) ) {
baseInfo_child := _m1 A_Tab _m2 A_Tab _m3 A_Tab _m4
indexCount ++
ResultTable .= indexCount A_Tab devInfo A_Tab baseInfo A_Tab baseInfo_child A_Tab "不合规" "`r`n"
}
}
ResultTable := (ResultTable = "") ? (devInfo "`r`n") : ResultTable
}
ParamToObj() {
global 0
obj := {}
Loop, %0%
{
param := %A_Index%
If RegExMatch(param, "^(/|-)+(\w+)(\W(.+))?$", match) {
obj[match2] := match4
key := match2
}
Else If (key != "")
obj[key] := param, key := ""
}
Return obj
}
作者: DAIC 时间: 2014-11-28 08:54
回复 4# ads350668398
人家收到钱,写出了代码,本来已经两清了。不过骂人这种方法真的太二了,我的做法是解释可以但是必须先加一千块钱。
作者: ads350668398 时间: 2014-11-28 20:21
我说话 淘宝秒东西 没有给 有图片 为证 没有到账的点卡 数据为证 支付宝作为三方 规则偏袒商户 没有我的同意就 吧我的钱打到了 商户
【我说的是这个】
跟什么写代没有办毛码有关系!!!!
作者: heiben 时间: 2014-11-28 20:34
回复 5# tmplinshi
感谢5楼啦。。已经汇款给楼主。看来语言真的不在于是否强大,而是在于所编写的人和编写人的思路。
没想到这么快就可以结贴了。。
作者: CrLf 时间: 2014-11-29 14:55
回复 8# heiben
ahk 很强大的好吗...
不过文本处理确实不算它的强项
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |