如何使用正则表达式来抓取/解析此数据?

时间:2010-11-30 08:02:28

标签: regex parsing

对于正则表达式,我真的是初学者,我不确定从哪里开始。我从网页上抓取了一些HTML代码并存储在变量中,它看起来像这样:

<thead><tr>
<th></th>
<th>GENERAL INFORMATION</th>
<th></th>
<th>DETAILED DATA</th>
</tr></thead>
<tbody><tr>
<th>ID</th>
<td>123456789ABCD</td>
<th>Field1</th>
<td>6 = (Some-Specification (3 or more details))</td>

</tr></tbody>
<tbody><tr>
<th>AGL</th>
<td>1 - United States ; TH - Some Data</td>
<th>Field2</th>
<td>7 = (Option/Other Option)</td>
</tr></tbody>
<tbody><tr>
<th>MANUFACTURER</th>
<td>2010 SPECIFICATION  (ADSD: HMKC)</td>
<th>Field3</th>

<td>8 = (My Type)</td>
</tr></tbody>
<tbody><tr>
<th>MODEL</th>
<td>6X4 MY-MODEL/SOME_SPECS LONG SPECIFICATION, BLAH</td>
<th>Field4</th>
<td>9 = (STUFF/OTHER STUFF)</td>
</tr></tbody>
<tbody>

然后有更多相同的...我想将这些单元格中的数据解析为变量。 (例如,将“123456789ABCD”解析为ID变量)我正在使用ColdFusion,并且正在考虑使用REFindNoCaseREReplaceNoCaseSpanExcluding等方法...我知道如何才能完成这个?或者,如果您不熟悉ColdFusion,即使只是解析此数据所需的正则表达式也非常有用。

3 个答案:

答案 0 :(得分:7)

不要将Regex用于HTML。它会摧毁你。

如果你正在做很多这样的事情,你应该得到一个HTML工具,例如TagSoup,它可以规范化HTML。如果您正在使用来自一个站点的Web页面,那么您可以创建一个XSLT样式表(或使用XPath的DOM工具),它可以提取您想要的单元格。

您的单元格的X路径(我省略了HTML命名空间)可能是

//tbody/tr[1]/td[1]

或者您可能希望按ID

查找行
//tbody/tr[th='ID']]/td

[HTML看起来相当混乱 - 它在同一th中使用tdtr,这不是惯用的。]

答案 1 :(得分:1)

使用CF xml parser, XmlParse。看起来它基于严格的XML,所以请确保通过类似htmltidy

的方式运行输入

答案 2 :(得分:1)

我同意这个平台的主要观点,即用正则表达式解析HTML并不是“黄金之路”。但在某些情况下,它只是最简单的方法,它只是做它需要做的事情。

这个正则表达式应该做你需要的:

<th>((?!</th>).)*</th>\s*<td>((?!</td>).)*</td>

使用捕获组1作为键,使用组2作为值。

我不知道ColdFusion所以我不能告诉你如何应用它。