1

我正在尝试解析以下网站,因此我在 iOS 上显示这样的数据:

9月6日星期六

Causeway
Bond 的 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 对象添加到数组中。

还是我最好将所有表格作为单独的元素获取,然后单独解析里面的数据?

任何帮助、指南或想法将不胜感激。

4

1 回答 1

1

我最近对一个古老的 hpple 问题给出了这个答案。

将指向 autograss 站点的 URL 和查询字符串更改为...

NSString *queryString = @"//table";

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

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

          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 的数组元素,那么递归将需要调整。

更新

在查看了这个问题的答案后,我意识到可以通过使用条件查询进行一些整理:

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

或者

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

第一个查询提取元素节点,而第二个查询提取文本节点本身。因此,第二个不需要递归方法来深入研究标签,但(据我所知)没有带来更多信息,例如父标签。

于 2014-10-28T12:06:15.287 回答