Получить данные таблицы из html с помощью hpple

Я пытаюсь проанализировать следующий веб-сайт, поэтому я отображаю такие данные на iOS:

Суббота, 6 сентября

Causeway
Гоночная трасса Bond's 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? Я попробовал это и сразу же получил ошибку добавления нулевого объекта в массив.

Или мне лучше получить все таблицы как отдельные элементы, а затем отдельно проанализировать данные внутри?

Любая помощь, руководства или идеи будут очень признательны.


person Harg    schedule 24.10.2014    source источник


Ответы (1)


Недавно я дал этот ответ на старый вопрос.

Изменение URL-адреса сайта autograss и строки запроса на...

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";

or

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

Первый запрос извлекает узлы-элементы, тогда как второй извлекает сами текстовые узлы. Следовательно, второй не нуждается в рекурсивном методе для изучения тегов, но (насколько я понимаю) не приносит дополнительной информации, такой как родительский тег.

person cate    schedule 28.10.2014
comment
Это большая помощь, Кейт. В итоге мне пришлось вытащить все данные td и сделать некоторые хитрости, чтобы избавиться от ссылок на пустые ячейки и определить, где я был в документе, по количеству нулевых ссылок, которые я уже видел. Спасибо! - person Harg; 29.10.2014
comment
Спасибо, Харг; возможно, стоит взглянуть на другие q, помеченные hpple, чтобы получить подсказки - я очень мало нашел о том, как создавать запросы. Чтобы сделать данные немного более управляемыми, метод можно изменить, чтобы использовать element.parent.tagName для добавления @"date": [NSMutableArray] ключ-значение в глобальный словарь для каждой новой даты и добавления этого массива для каждого <td> текста. - person cate; 29.10.2014