ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: liu-aguang

[原创] 网页数据采集---网页文档解析篇(json/html/xml)

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2017-10-9 22:09 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖已被收录到知识树中,索引项:网页交互
先收藏,慢慢学。

TA的精华主题

TA的得分主题

发表于 2017-12-3 17:45 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 lms008 于 2017-12-3 17:49 编辑

向老师请教@liu-aguang,我想把xml 中有row 对应的记录相关的 item  visible="true" 的value 值保存到excel 文档中?请问如何过滤这些记录呢?
xml的结构如下:
<lov id="MasterSearchLOV" name="null" xsl="style/masterEnquiry.xsl">
<search id="MasterSearchLOV_search">...</search>
<recordSet>
<header>...</header>
<content>
<row order="odd">
<item visible="false">...</item>
<item visible="true">HK17112202473392</item>
<item visible="true">CREDIT CARDS</item>
<item visible="true">CHAN TAI MAN</item>
<item visible="false">1241</item>
<item visible="false">2029</item>
<item visible="false">01</item>
<item visible="true">HKSPG17VAWV000</item>
<item visible="true">HKID / A1234563</item>
<item visible="false">90</item>
<item visible="false">A1234563</item>
<item visible="false"></item>
<item visible="false">9999999</item>
<item visible="false"></item>
<item visible="false"></item>
<item visible="true">PRESCREEN</item>
<item visible="true">PENDING</item>
<item visible="true">AIP</item>
<item visible="true">2017-11-22 00:00:00.0</item>
<item visible="false"/>
<item visible="true"/>
<item visible="false">1002</item>
<item visible="false">Y</item>
<item visible="false"/>
<item visible="false">3007</item>
<item visible="false"/>
<item visible="false"/>
<item visible="false">-</item>
<item visible="false"/>
<item visible="false"></item>
<item visible="false"/>
<item visible="false"/>
<item visible="false"></item>
<item visible="false">HKR1206-22112017154134-22804</item>
<item visible="false"></item>
<item visible="false"></item>
<item visible="false">-</item>
<item visible="false"></item>
<item visible="false"></item>
<item visible="false"/>
<item visible="false"></item>
<item visible="false"></item>
</row>
<row order="even">...</row>
<row order="odd">...</row>
<row order="even">...</row>
<row order="odd">...</row>
<row order="even">...</row>
<row order="odd">...</row>
<row order="even">...</row>
<row order="odd">...</row>
<row order="even">...</row>
<row order="odd">...</row>
<row order="even">...</row>
<row order="odd">...</row>
<row order="even">...</row>
<row order="odd">...</row>
<row order="even">...</row>
<row order="odd">...</row>
<row order="even">...</row>
<row order="odd">...</row>
<row order="even">...</row>
</content>
</recordSet>

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-12-4 16:20 | 显示全部楼层
lms008 发表于 2017-12-3 17:45
向老师请教@liu-aguang,我想把xml 中有row 对应的记录相关的 item  visible="true" 的value 值保存到excel ...

提供的xml文档格式不完整.具体操作时请加载完整格式的xml文档,下面是提取代码片断:
  1.     For Each x In xmlDoc.getElementsByTagName("row")   'xmlDoc是加载xml文档后XMLDOM对像
  2.         For Each y In x.getElementsByTagName("item")
  3.             If y.Attributes.getNamedItem("visible").NodeValue = "true" Then
  4.                 Debug.Print y.Text '满足条件的值
  5.             End If
  6.         Next
  7.     Next
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-12-4 16:39 | 显示全部楼层
本帖最后由 liu-aguang 于 2017-12-8 18:21 编辑
  1. 'xPath方法
  2.     For Each k In xmlDoc.SelectNodes("//row/item[@visible='true']")
  3.         Debug.Print k.Text
  4.     Nex
复制代码

TA的精华主题

TA的得分主题

发表于 2017-12-5 11:26 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-12-5 15:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

好的,谢谢,学习了。

TA的精华主题

TA的得分主题

发表于 2018-2-25 13:53 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
看了前两页,忍不住叫好!

看完此贴,估计自己能入门了,收藏学习!

TA的精华主题

TA的得分主题

发表于 2018-3-12 09:53 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
感谢楼主分享,学习中。

TA的精华主题

TA的得分主题

发表于 2018-3-17 22:28 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-3-20 12:57 | 显示全部楼层
本帖最后由 lms008 于 2018-3-20 15:27 编辑

向老师请教@liu-aguang, 在采集数据中,返回的数据是类似XML格式的数据,数据在附件中:
问题:
我需要解析里面多条记录的数据,取出对应的字段。
1):保存到xml 文件代码如下:
Sub makeXml(inputed_string As String, log_path As String, fileName As String)
   Dim objFSO, logfile, logtext, log_folder, log_Newpath

   Set objFSO = CreateObject("Scripting.FileSystemObject")
   On Error Resume Next
   log_Newpath = log_path & "\responseData"
   Set log_folder = objFSO.CreateFolder(log_Newpath)

   If objFSO.FileExists(log_Newpath & "\" & fileName) = 0 Then
       Set logfile = objFSO.CreateTextFile(log_Newpath & "\" & fileName, True, -1)
   End If
   Set log_folder = Nothing
   Set logfile = Nothing

   Set logtext = objFSO.OpenTextFile(log_Newpath & "\" & fileName, 2, True, -1)
   logtext.Write "<?xml version=""1.0"" encoding=""UTF-8""?>"
   logtext.Write inputed_string
   logtext.Close

   Set objFSO = Nothing
End Sub


我想把这些数据保存在一个xml文件中,
2):在用dom来读取xml格式的数据:代码简单如下:
Function ParseXMLData()
        Dim strXMLPath As String
        Dim xmlDoc, rcdSetList, recordTmp, row_list, row_files, nodes
        Dim strAppID, strPrd, strCustNam, strCmpCde, strAppStatus, strPrsStatus, strQueStatus, strAppDte, strDrwaDate, strPendStatusFlag
        Dim i As Integer

        On Error GoTo errHandler

        'strXMLPath = ThisWorkbook.Path & "\responseData\data_search_result.xml"
         strXMLPath = "D:\H\2015_CR_SIRS\VBA\RDF_EUC_PCL&Porfolios\CSIM_user_blacklist_TUEF_AC\Login_COS_CSIM\COS_testing_20180319\cos" & "\data_search_result2.xml"
        Set xmlDoc = CreateObject("Microsoft.XMLDOM")
        xmlDoc.async = "false"

        If Not IsEmpty(Worksheets("COS_Search_data").Activate) Then ActiveSheet.UsedRange.ClearContents
        ActiveSheet.[a1:j1] = Array("Application ID", "Anchor product", "Customer Name", "Campaign Code", "Application status", "Process status", "Queue Status", "Application date", "Draw down date", "Pending Application Flag")

        xmlDoc.Load (strXMLPath)
        Set rcdSetList = xmlDoc.SelectNodes("lov/recordSet")
        For Each recordTmp In rcdSetList
            Set row_list = recordTmp.SelectNodes("content/row")
            i = 1
            For Each row_files In row_list
                i = i + 1
                'Debug.Print row_files.Attributes(0).Text
                 strAppID = row_files.ChildNodes(1).ChildNodes(0).NodeValue
                 strPrd = row_files.ChildNodes(2).ChildNodes(0).NodeValue
                 strCustNam = row_files.ChildNodes(3).ChildNodes(0).NodeValue
                 strCmpCde = row_files.ChildNodes(7).ChildNodes(0).NodeValue
                 strAppStatus = row_files.ChildNodes(5).ChildNodes(0).NodeValue
                 strPrsStatus = row_files.ChildNodes(16).ChildNodes(0).NodeValue
                 strQueStatus = row_files.ChildNodes(17).ChildNodes(0).NodeValue
                 strAppDte = row_files.ChildNodes(18).ChildNodes(0).NodeValue
                ' strDrwaDate = row_files.ChildNodes(19).ChildNodes(0).NodeValue

                Cells(i, 1) = strAppID
                Cells(i, 2) = strPrd
                Cells(i, 3) = strCustNam
                Cells(i, 4) = strCmpCde
                Cells(i, 5) = strAppStatus
                Cells(i, 6) = strPrsStatus
                Cells(i, 7) = strQueStatus
                Cells(i, 8) = strAppDte
                Cells(i, 9) = strDrwaDate

                'Add logic for Pending Appliction flag.
                'for Pending Appliction = No
                'if Application Status = ACCEPTED & Process Status =COMPLETED  OR
                'Application Status = CANCELLED OR Application Status = DECLINED OR No Application
                'Else Pending Appliction = Yes
                If strAppStatus = "" Then
                    strPendStatusFlag = "NO"
                ElseIf strAppStatus = "ACCEPTED" & strPrsStatus = "COMPLETED" Then
                    strPendStatusFlag = "NO"
                ElseIf strAppStatus = "CANCELLED" Then
                    strPendStatusFlag = "NO"
                ElseIf strAppStatus = "DECLINED" Then
                    strPendStatusFlag = "NO"
                Else
                    strPendStatusFlag = "YES"
                End If
                 Cells(i, 10) = strPendStatusFlag
            Next
        Next
        Columns("H:H").NumberFormatLocal = "yyyy/mm/dd hh:mm:ss"
        Application.ScreenUpdating = True
        ActiveSheet.[A:I].Columns.AutoFit
        ParseXMLData = True
        Exit Function

errHandler:
        MsgBox Err.Number & vbTab & Err.Description, vbCritical + vbOKOnly, "Parse XML Data Failed"
        ActiveWorkbook.Sheets("log").Activate
        ActiveSheet.Cells(8, 2) = Trim(Err.Description) & "::" & Replace(Err.Number, "-", "")
        ParseXMLData = False
        Exit Function
End Function

附近如下:
单是行数那行就有问题,导致数据不能解析出来。
  想请教老师,如何可以把response data (附件的数据)保存到一个xml 文档中? 或者其它方法可以快速的解析出我想要的数据

ResponseData1.rar

6.38 KB, 下载次数: 24

返回数据

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-20 20:38 , Processed in 0.044440 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表