使用hpple从html获取表数据

时间:2014-10-24 10:35:35

标签: ios objective-c xpath hpple

我正在尝试解析以下网站,以便在iOS上显示如下数据:

9月6日星期六


邦德的Glen Raceway
11:00
RO
两天会议
两个单独的日子

该网站的一个例子:

    <div id="main-column">
<h1>September</h1>
    <table align="center"><col width="200"><col width="150"><col width="100"><col width="120"><col width="330"><col width="300">
        <h2>Saturday 06 September</h2>
        <tr id="table1">
            <td><b>Club</b></td>
            <td><b>Venue</b></td>
            <td><b>Start Time</b></td>
            <td><b>Meeting Type</b></td>
            <td><b>Number of Days for Meeting</b></td>
            <td><b>Notes</b></td>
        </tr>
        <tr id="table2">
            <td>Causeway</td>
            <td>Bond's Glen Raceway</td>
            <td>11:00am</td>
            <td>RO</td>
            <td>Two Day Meeting,<br> Two Separate Days</td>
            <td></td>
        </tr>
        <tr id="table3">
            <td>West Waterford</td>
            <td>Ballysaggart</td>
            <td>11:00am</td>
            <td>RO</td>
            <td>Two Day Meeting,<br> One Meeting Over Two Days</td>
            <td></td>
        </tr>

到目前为止,我已设法使用以下代码获取所有日期:

    -(void)loadData {

NSURL *url = [NSURL URLWithString:@"http://www.national-autograss.co.uk/september.htm"];
NSData *htmlData = [NSData dataWithContentsOfURL:url];


TFHpple *htmlParser = [TFHpple hppleWithHTMLData:htmlData];


NSString *xpathQueryString = @"//h2";
NSArray *eventNodes = [htmlParser searchWithXPathQuery:xpathQueryString];



NSMutableArray *eventDates = [[NSMutableArray alloc] initWithCapacity:0];
for (TFHppleElement *element in eventNodes) {

    NSString *date = [[element firstChild] content];
    [eventDates addObject:date];

}

_objects = eventDates;
[self.tableView reloadData];

}

表格中的数据需要的Xpath查询是// table / tr / td吗?我尝试了这个,我立刻得到了一个错误,即向数组中添加一个nil对象。

或者我最好将所有表作为单独的元素,然后单独解析内部数据?

非常感谢任何帮助,指南或想法。

1 个答案:

答案 0 :(得分:1)

我最近给了this answer一个旧的问题。

将URL更改为autograss网站,将查询字符串更改为...

NSString *queryString = @"//table";

...为了获得所需文本节点的最近祖先,给出了这个日志输出:

  

2014-10-28 11:52:02.416 SiteSearcher [28314:613] theText:

          Saturday 06 September

              Club
                Venue
                Start Time
                Meeting Type
                Number of Days for Meeting
                Notes


                Causeway
                Bond's Glen Raceway
                11:00am
                RO
                Two Day Meeting, Two Separate Days



                West Waterford
                Ballysaggart
                11:00am
                RO
                Two Day Meeting, One Meeting Over Two Days


            Sunday 07 September...

但也给出了

        ...2014 Fixtures:
            January
            February
            March
            April
            May
            June


            2014 Fixtures Cont'd:
            July
            August
            September
            October
            November
            December


            Official Details:
            Regisitered Address:
                46 Brookside, Alconbury,
                Huntingdonshire, PE28 2EP.

...因为它检索所有表。

(请原谅着色 - 日志输出选项卡似乎搞乱了blockQuotes!)。

我不知道具有所有混乱的文本是否有用,但也许这是一个开始。但是,如果您希望将文本的片段分配给某些TableView的数组元素,那么递归将需要进行调整。

<强>更新

在查看this question的答案后,我意识到可以使用条件查询进行一些整理:

NSString *xPathQueryString = @"//tr[not(@id='table1')]|//h2";

NSString *xPathQueryString = @"//h2/text()|//tr[not(@id='table1')]//td/text()";

第一个查询拉取元素节点,而第二个查询拉取文本节点本身。因此,第二个方法不需要递归方法来在标记内进行深入研究,但(据我所见)不会带来更多信息,例如父标记。

相关问题