为什么每次都返回相同的html标记属性?

时间:2011-03-17 09:45:06

标签: html f# html-agility-pack

我试图使用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”标签的标题。 任何提示?

1 个答案:

答案 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”。