Board logo

标题: [问题求助] (已结贴)求助大神,抓取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应该更快解决,抓取
  1. <tr class="unaccorg">
复制代码
这一部分的内容就可将检查点的大部分都抓取了,但难点就在如何连同基线项,等级与检查点等都关联上。。结果只要不合规的,也就是打红色交叉
的。

最终结果的输出要与excel的相同。
  1. import java.io.BufferedReader;
  2. import java.io.FileOutputStream;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.io.OutputStreamWriter;
  7. import java.io.PrintWriter;
  8. import java.net.URL;
  9. import java.net.URLConnection;
  10. import java.util.regex.*;
  11. public class Test {
  12. public static void main(String[] args) {
  13. try {
  14. URL url = new URL("http://127.0.0.1/html/10.248.1.68(80).html");
  15. URLConnection conn = url.openConnection();
  16. conn.setDoOutput(true);
  17. InputStream in = null;
  18. in = url.openStream();
  19. String content = pipe(in,"utf-8");
  20. //System.out.println(content);
  21.     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>(.*?)";
  22.     String html=content;
  23.    
  24.     Pattern p1=Pattern.compile(Regex);
  25.     Matcher m=p1.matcher(html);
  26.   
  27.     while(m.find())
  28.     {
  29.      //System.out.println(m.group());
  30.      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));
  31.     }
  32. } catch (Exception e) {
  33. e.printStackTrace();
  34. }
  35. }
  36. static String pipe(InputStream in,String charset) throws IOException {
  37.         StringBuffer s = new StringBuffer();
  38.         if(charset==null||"".equals(charset)){
  39.          charset="utf-8";
  40.         }
  41.         String rLine = null;
  42.         BufferedReader bReader = new BufferedReader(new InputStreamReader(in,charset));
  43.         PrintWriter pw = null;
  44.       
  45. FileOutputStream fo = new FileOutputStream("test.html");
  46. OutputStreamWriter writer = new OutputStreamWriter(fo, "utf-8");
  47. pw = new PrintWriter(writer);
  48.         while ( (rLine = bReader.readLine()) != null) {
  49.             String tmp_rLine = rLine;
  50.             int str_len = tmp_rLine.length();
  51.             if (str_len > 0) {
  52.               s.append(tmp_rLine);
  53.               pw.println(tmp_rLine);
  54.               pw.flush();
  55.             }
  56.             tmp_rLine = null;
  57.        }
  58.         in.close();
  59.         pw.close();
  60.         return s.toString();
  61. }
  62. }
复制代码

作者: 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