【问题标题】:Get table data from html using hpple使用 hpple 从 html 获取表数据
【发布时间】:2014-12-20 04:39:09
【问题描述】:

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

9 月 6 日星期六

堤道
邦德的格伦赛道
上午 11:00
反渗透
两天会议
两个不同的日子

网站示例:

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

或者我最好将所有表格作为单独的元素获取,然后单独解析其中的数据?

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

【问题讨论】:

    标签: ios objective-c xpath hpple


    【解决方案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()";
    

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

    【讨论】:

    • 这是一个很好的帮助。我最终不得不提取所有 td 数据并做一些技巧来摆脱空单元格的引用,并通过我已经看到的空引用数量来计算出我在文档中的位置。谢谢!
    • 谢谢,哈格;可能值得查看带有 hpple 标记的其他 q 以收集提示 - 关于如何构建查询,我发现很少。为了使数据更易于操作,可以将方法更改为使用 element.parent.tagName@"date": [NSMutableArray] 键值添加到全局字典 foreach 新日期并附加该数组 foreach &lt;td&gt; 文本。
    猜你喜欢
    • 2013-08-29
    • 2013-04-15
    • 1970-01-01
    • 2011-06-05
    • 2013-01-08
    • 2012-06-30
    • 2023-04-03
    • 2015-02-12
    • 2014-08-13
    相关资源
    最近更新 更多