зачем каждый раз возвращать один и тот же атрибут тега html? - PullRequest
0 голосов
/ 17 марта 2011

Я пытаюсь проанализировать некоторые данные из некоторого 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", это атрибут title

2-Внутренний текст "а"

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 Ответ

4 голосов
/ 17 марта 2011

Я не знаком с 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);
}

Основная проблема, с которой вы столкнулись, заключается в том, что вы используете выражение «// p», которое начинается с корня, вместо «.//p», которое начинается с текущего узла.

...