我试图使用html敏捷性从一些html解析一些数据。这就是许多表行的数据:
<tr>
<td><a href="showindex.cfm"><span class="style1">companies</span></a></td>
<td><b>71</b></td>
</tr>
<tr>
<td>
<font><b><a href="showindex.cfm">political situation</a></b></font></td>
<td><b>76</b></td>
</tr>
<tr>
<td><p title=" This is the political stability data;Score: 0.01;Sene:">
<a href="showdatatable.cfm">political stability denge</a></p></td>
<td> 7</td>
</tr>
<tr>
<td><p title="This index combines policies.;Score: -0.34;Sene:">
<a href="showdatatable.cfm">local government support</a></p></td>
<td> 8</td>
</tr>
<tr>
<td><p title="This combines legal situation data;Score: 3.59;Sene:">
<a href="showdatatable.cfm">legal situation</a></p></td>
<td > 9</td>
</tr>
我制作了一个外部“td”标签的序列。
我感兴趣的是:每个表格行提取
1-如果有“p”标签,则为标题属性
“a”的内部文本
3-最后一个“td”标签的内部文本。并使他们成为元组, 喜欢
(" This is the political stability data;Score: 0.01;Sene:", "companies", "71");
我首先将每两个“td”标签设为一个元组(我的方法可能非常粗略地抱歉),然后提取我感兴趣的数据。 这是我的代码
tdSeq:seq<HtmlNode>
tdSeq
|>Seq.pairwise
|>Seq.mapi(fun int item -> (int, item))
|>Seq.filter(fun (no, _) -> no%2 = 0)
|>List.ofSeq
|>List.map(fun (no, item ) -> item)
|>List.map(fun (a, b) ->
let data = a.InnerText.Trim()
let value= b.InnerText.Trim()
let title=
let p= a.SelectSingleNode("//p" )
if p.Attributes.["title"] <> null then
p.Attributes.["title"].Value
else
""
(title, data, value))
我的问题是每个元组只返回第一个“p”标签的标题。 任何提示?
答案 0 :(得分:4)
我不熟悉F#,但这里是C#等价物:
HtmlDocument doc = LoadMyDocument();
foreach (HtmlNode tr in doc.DocumentNode.SelectNodes("tr"))
{
string title = null;
HtmlNode titleNode = tr.SelectSingleNode(".//p");
if (titleNode != null)
{
title = titleNode.GetAttributeValue("title", null);
}
string anchor = null;
HtmlNode anchorNode = tr.SelectSingleNode(".//a");
if (anchorNode != null)
{
anchor = anchorNode.InnerText;
}
string value = null;
HtmlNode valueNode = tr.SelectSingleNode("td[last()]");
if (valueNode != null)
{
value = valueNode.InnerText.Trim();
}
Console.WriteLine("title=" + title);
Console.WriteLine("anchor=" + anchor);
Console.WriteLine("value=" + value);
}
你遇到的主要问题是因为你使用了一个以root开头的“// p”表达式,而不是从当前节点开始的“.//p”。