我正在努力抓取一个网站。我已经设法获取了我需要的内容,这是一个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的组合:
答案 0 :(得分:3)
您可以使用jSoup java库来实现您的目标。它将让你parse your scraped html string和then 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>