Как разобрать HTML на iPhone с помощью TouchXML или других библиотек?

#iphone #parsing #ios5 #touchxml #hpple

#iPhone #синтаксический анализ #ios5 #touchxml #hpple

Вопрос:

У меня грязный HTML-код, который загружается с внешнего сервера (поэтому я не могу создать файл json или очистить html-код). Структура моего HTML похожа:

 <!-- SOME DIRTY HTML, CSS, JS, AND OTHER STUFF -->

<div class="pic"> ... </div>

<div class="pic" id="pic311809">

<input type="hidden" class="pic_id" name="pic_id" value="311809" />

<!-- tylko komixxy.pl -->
<div style="font-family: verdana, arial, helvetica, sans-serif; font-weight: bold; font-size: 9px;">
                                        <a href="pic/show_series/1">FFFUUU (rageman)</a>
        </div>

<h1 class="picture">Kochana babcia</h1>

<div class="infobar">
    Wrzucone 15 października 2010 o 16:03       przez <a href="/user/Astraly">Astraly</a>
    |
    <a href="http://komixxy.pl/311809/Kochana-babcia#comments">Skomentuj (23)</a>
    <!-- głosowanie przeniesione pod spód obrazka -->
</div><!-- .infobar -->


<div class="pic_image">
                <a href="http://komixxy.pl/311809/Kochana-babcia"><img src="http://staticrps.komixxy.pl/uimages/201010/1287151388_by_Astraly_500.jpg" class="pic" alt="Kochana babcia - Wnusiu, a ty jeszcze nie w szkole? Dziś mamy na 10 babciu Co ty tam majaczysz? Jesteś na wagarach!? już ja to powiem twojej mamie! Ale babciu.... Przynosisz nam wstyd! Myślisz, że nie wiem o tej ostatniej niedzieli, w której nie byłeś u komunii? ZAMKNIJ SIĘ KU**A!!!! .... Nie musisz tak krzyczeć! Powiem twojej mamie z jakim tonem odnosisz się do mnie! " /></a>          </div><!-- .pic_image -->

                <div class="source">Źródło: Kto mieszka z babcią, ten wie jak to jest ;)</div>

<!-- głosowanie i ocena -->

<div class="source">

    <div class="infobar center">

        Głosuj:

        <a href="/pic/vote/311809/up"
             onclick="votowanie(this); return false;"
             class="vote voteup iconlink"
        >
            mocne ↑         </a>

        amp;middot;

        <a href="/pic/vote/311809/down"
             onclick="votowanie(this); return false;"
             class="vote votedown iconlink"
        >
            słabe ↓         </a>


        <!-- DODATKOWY PRZYCISK RAPORTOWANIA DUPLIKATÓW (“BYŁO”) -->

        |

        <span class="points">
                                87% mocnych
                        </span>

        <span class="count">
                                z 1291 głosów
                        </span>

        <span class="vote_result"></span>

                    | <a href="/user/add_favorite/311809" class="favorite">Do ulubionych</a>


    </div><!-- .infobar -->

    <!-- PRZYCISK LAJKONIKA -->
    <div style="text-align: center;">
        <fb:like href="http://komixxy.pl/311809/Kochana-babcia"
                         layout="button_count"
                         show_faces="true"
                         width="130"
                         font="arial"
                         style="width: 130px;">
        </fb:like>
    </div>

    <!-- tylko komixxy.pl -->
    <a href="http://komixxy.pl/pic/show_group/311809" class="picbutton">Pokaż podobne komixxy</a>       <a href="http://komixxy.pl/przerob/311809" class="picbutton">Zrób własną wersję</a>
    <div style="clear: both;"></div>

</div><!-- .source -->



</div><!-- .pic -->

<div class="pic"> ... </div>

<div class="pic"> ... </div>

<div class="pic"> ... </div>
 

Я хочу выбрать все <div class="pic" id="*"> , используя XPath //div[@class='pic'][@id] .

Вот две библиотеки, которые я использовал:

 - Hpple
- TouchXML
 

Что касается Hpple -> это здорово, но я не могу выбрать innerHTML emelent. Что касается TouchXML, я использую его для синтаксического анализа XML, и это здорово. Но ему не удается разобрать грязный HTML — я получаю десятки ошибок.

Есть ли способ проанализировать этот HTML в iOS5 с помощью TouchXML? Это может быть другая библиотека, но я предпочитаю эту.

Я кое-что слышал CTidy.h и сделал, как указано, но ничего не изменилось…

Комментарии:

1. Я бы сказал, что у вас более или менее есть решение. Используя комбинацию Hpple и TouchXML, вы получите нужные вам фотографии.

2. Но как? Hpple использует простой libxml2 синтаксический анализ HTML, поэтому я не могу выбрать innerHTML элемента. Если бы я мог это сделать, у меня не было бы проблем с синтаксическим анализом…

3. @Kashiv, пожалуйста, предоставьте подробную процедуру вставки библиотеки TouchXML в iOS 5, как преобразовать библиотеку TouchXML в режиме, отличном от ARC?

4. @RRB В их репозитории GitHub есть ARC-версия TouchXML. 😉

5. @Kashiv, я получил его вчера, но в любом случае спасибо за помощь.

Ответ №1:

в libxml есть модуль, разработанный именно для этой проблемы 🙂

http://xmlsoft.org/html/libxml-HTMLparser.html

Он работает точно так же, как обычно работает libxml, т.Е. Для анализа NSData объекта, содержащего грязный html:

 #include <libxml/htmlparser.h>

htmlDocPtr doc; /* the resulting document tree */
doc = htmlReadMemory([data bytes], [data length], "noname.xml", NULL, HTML_PARSE_RECOVER | HTML_PARSE_NOWARNING | HTML_PARSE_NOERROR);
if (NULL == doc)
    return nil;

... parse DOM here ...

xmlFreeDoc(doc);
 

по сравнению с примером libxml с их веб-сайта :

 xmlDocPtr doc; /* the resulting document tree */
doc = xmlReadMemory(content, length, "noname.xml", NULL, 0);
if (NULL == doc)
    return nil;

... parse DOM here ...

xmlFreeDoc(doc);
 

PS Не забудьте включить libxml2.dylib в свой проект в качестве фреймворка на этапе сборки проекта «связать двоичный файл с библиотеками»

Комментарии:

1. Но могу ли я получить innerHTML элемента <div>, используя это?

2. Отлично! Я просто отредактировал CXHTMLDocument.m (добавил HTML_PARSE_NOERROR флаг), и все работает! Спасибо!

Ответ №2:

Если бы я делал это, я бы проанализировал HTML перед передачей его в библиотеки и очистил все «грязные» биты, нашел и и удалил все промежуточное, проделав то же самое для других грязных областей, тогда библиотекам будет легче работать с файлом.