将数据转换为具有名称和范围的形式范围对

时间:2017-04-20 05:54:17

标签: coldfusion

我正在努力抓取一个网站。我已经设法获取了我需要的内容,这是一个HTML表格,如下所示:

<table id="warranty-information">
    <tr>
        <th colspan="2" class="ui-corner-top">Warranty Information</th>
    </tr>
    <tr>
        <td style="vertical-align: top;">Warranty</td>
        <td style="vertical-align: top;">2 Years</td>
    </tr>
    <tr>
        <th colspan="2" class="ui-corner-top">Hardware</th>
    </tr>
    <tr>
        <td style="vertical-align: top;">Adapter Style</td>
        <td style="vertical-align: top;">Cable Adapters</td>
    </tr>
    <tr>
        <td style="vertical-align: top;">Converter Type</td>
        <td style="vertical-align: top;">Cable Adapters</td>
    </tr>
    <tr>
        <td style="vertical-align: top;">Output Signal</td>
        <td style="vertical-align: top;">DisplayPort</td>
    </tr>
</table>

我想显示<TD>的第一个<TR> as a named input field whose value is the text inside the `block。

我还希望显示第二个输入字段,其中包含来自第二个<TD>块的值,但是如何执行此操作会丢失。

使用cflib的一些函数,比如flattenSruct()和ConvertXMLtoStruct(),这是我到目前为止所尝试的:

<cfset regExp = REMatch('(?s)<div class="tab-pane" id="tchspcs".*?</div>',str)> 
<cfset regData = Replace(regExp[1],'<br> ','-','all')>
<cfset xhtm = Application.jtidy.makexHTMLValid(strToParse='#regData#')>
<cfset xhtml = Replace(xhtm,'<br />','-','all')>
<cfset getdataStructs = Application.ftSys.ConvertXmlToStruct(XMLParse(xhtml))>
<cfdump var="#xhtml#">
<cfset ApiData = getdataStructs.div.table.tr>

<table align="center" width="100%">
<cfloop from="1" to="#arrayLen(ApiData)#" index="i">
    <cfset data = Application.ftSys.flattenStruct(ApiData[i])>
    <cfloop collection="#data#" item="key">
    <cfoutput>
       <cfif key eq 'td'>
       <tr>
          <!---<cfif trim(data[key][1]) NEQ "">--->
          <cfdump var="#data[key]#">
          <td><input type="text" name="namespecification" id="namespecification" value="#data[key][1]#"></td>
          <!---</cfif>--->
          <td><textarea name="valuespecification" id="valuespecification" rows="5">#data[key][2]#</textarea></td>
          <!---#key#:#data[key]#--->
       </tr>
       </cfif>  
     </cfoutput>
    </cfloop> 
</cfloop>
</table>

我循环遍历一组结构,但是一些数组是空的,每个数组都是单个实体,如2的组合:

First Image

single entity array

2 个答案:

答案 0 :(得分:3)

您可以使用jSoup java库来实现您的目标。它将让你parse your scraped html stringthen use DOM selectors一个jQuery来导航html结构。

选择tr td:first-child可以获得每行中第一个td的数组。

答案 1 :(得分:2)

这可以给你你想要的东西:

results.fileContent = FileRead(ExpandPath("test.html"));

loadPaths = ArrayNew(1);
loadPaths[1] = GetDirectoryFromPath(GetCurrentTemplatePath()) & "cfcs/jar/jsoup-1.10.2.jar";

loaderObj = createObject("component", "cfcs.javaloader.JavaLoader").init(loadPaths);
jsoup = loaderObj.create("org.jsoup.Jsoup");

doc = jsoup.parse(results.fileContent);
table = doc.select("##warranty-information");
trs = table.select("tr");
for(i = 0; i < trs.size(); i++) {
    tds = trs.get(i).select("td");
    if( tds.size() ) {
        form[ tds.get(0).text() ] = tds.get(1).text();
    }
}

WriteDump(form);

这假设您的HTML存储在文件(test.html)中,如下所示:

<table id="warranty-information">
    <tr>
        <th colspan="2" class="ui-corner-top">Warranty Information</th>
    </tr>
    <tr>
        <td style="vertical-align: top;">Warranty</td>
        <td style="vertical-align: top;">2 Years</td>
    </tr>
    <tr>
        <th colspan="2" class="ui-corner-top">Hardware</th>
    </tr>
    <tr>
        <td style="vertical-align: top;">Adapter Style</td>
        <td style="vertical-align: top;">Cable Adapters</td>
    </tr>
    <tr>
        <td style="vertical-align: top;">Converter Type</td>
        <td style="vertical-align: top;">Cable Adapters</td>
    </tr>
    <tr>
        <td style="vertical-align: top;">Output Signal</td>
        <td style="vertical-align: top;">DisplayPort</td>
    </tr>
</table>