【问题标题】:How to parse HTML on iPhone using TouchXML or other libraries?如何使用 TouchXML 或其他库在 iPhone 上解析 HTML?
【发布时间】:2024-05-21 10:40:01
【问题描述】:

我有一个从外部服务器加载的脏 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>

        &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>

我想使用 xPath //div[@class='pic'][@id] 选择所有 &lt;div class="pic" id="*"&gt;

这是我使用的两个库:

- Hpple
- TouchXML

至于 Hpple -> 很好,但我不能选择一个 emelent 的 innerHTML。至于 TouchXML,我用它来解析 XML,它很棒。但它无法解析脏 HTML - 我得到了几十个错误。

有没有办法在 iOS5 中使用 TouchXML 解析这个 HTML?它可以是不同的库,但我更喜欢那个。

我听说了一些关于 CTidy.h 的事情,我按照指示做了,但没有任何改变......

【问题讨论】:

  • 我会说你或多或少有一个解决方案。结合使用 Hpple 和 TouchXML 将为您提供所需的图片。
  • 但是怎么做呢? Hpple 使用简单的libxml2 HTML 解析,所以我无法选择元素的innerHTML。如果我能做到这一点,我解析不会有问题......
  • @Kashiv,请提供在iOS 5中插入touchXML库的详细过程,如何在非ARC模式下转换TouchXML库?
  • @RRB 在他们的 GitHub 存储库中有 ARC 版本的 TouchXML。 ;)
  • @Kashiv,我昨天收到了,但无论如何感谢您的帮助。

标签: iphone parsing ios5 touchxml hpple


【解决方案1】:

libxml 有一个专门针对这个问题设计的模块 :)

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

它的工作原理与 libxml normally works 完全相同,即解析包含脏 html 的 NSData 对象:

#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 不要忘记在 'link binary with libraries' 项目构建阶段将 libxml2.dylib 作为框架包含到您的项目中

【讨论】:

  • 但是我可以使用这个来获得
    元素的 innerHTML 吗?
  • 太棒了!我刚刚编辑了CXHTMLDocument.m(添加了HTML_PARSE_NOERROR 标志),一切正常!谢谢!
【解决方案2】:

如果我这样做,我会在将 HTML 传递给库之前解析 HTML,并清除所有“脏”位,找到并删除其间的所有内容,对其他脏区域执行相同操作,那么它将是库更容易处理文件。

【讨论】:

    猜你喜欢
    相关资源
    最近更新 更多
    热门标签