SWI-Prolog如何解析HTML页面?

来源:互联网 发布:域名不备案会怎么样 编辑:程序博客网 时间:2024/06/14 05:19

http://www.swi-prolog.org/howto/scrape/ParseHTML.html

这可能是一个比你预期更复杂的事。首先,你不想处理HTML文本页面。没有将HTML事先翻译成一个数据结构的HTML文本解析,必然对各种不同方式创建的页面敏感。但是,我们发现HTML往往是无效的。更糟的是,事实上有时是XHTML,当文档要声明成XHTM通常包含HTML的功能,如缺少近距离标签,使用大写字母,等等。


SWI-Prolog的SGML/SML的解析器可以产生的结果,往往是抓取不够好。最好的选择集的文件的性质取决于一点点。显著不同的编码或使用严格和正确的XML网站可能会要求不同的选项。下面是一些代码作为一个开始。它静静地忽略所有的错误。这往往是你想要真正的抓取,但观看的消息可能会有所帮助的,如果你得到奇怪的输出。

http_load_html(URL, DOM) :-        setup_call_cleanup(http_open(URL, In,                           [ timeout(60)                           ]),                           (   dtd(html, DTD),                               load_structure(stream(In),                                              DOM,                                              [ dtd(DTD),                                                dialect(sgml),                                                shorttag(false),                                                max_errors(-1),                                                syntax_errors(quiet)                                              ])                           ),                           close(In)).

注意打开连接使用setup_call_cleanup/3保证最终将被关闭然而,不会停止的例外和错误正常处理Web文件一部分通常,抓取将使用一个控制结构如下处理一个URL不理它,如果它是不可能从URL检索数据请注意,我们给出的例子而不是代码因为实际抓取的要求,可以有很大的差异例如,它可能是不可接受的放弃,如果有一个错误可能要等待重试你的决定可能取决于错误返回等等。


scrape_no_error(URL) :-        catch(http_load_html(URL, DOM), Error,              (  print_message(warning, Error),                  fail              )), !,        process_dom(DOM).scrape_no_error(_).

另请参阅
     - http_open/3开放web页如果您需要处理cookieSWI-Prolog的5.10.3/5.11.16提供(HTTP /http_cookie
     - setup_call_cleanup/ 3你的朋友,以避免失去文件失败或错误情况处理
     - load_structure/ 3的进程更多的选择