如何从url读取短语以及SWI Prolog';s'open_http/2'供应?

如何从url读取短语以及SWI Prolog';s'open_http/2'供应?,http,parsing,prolog,swi-prolog,dcg,Http,Parsing,Prolog,Swi Prolog,Dcg,我正在使用SWI Prolog库(http/http\u open)。“在[http\u open(Url,Stream,[])]成功后,可以从流中读取数据。”因此,我想也许我可以通过使用库(纯输入)中的phrase\u from\u Stream/2装配一个简单的声明性谓词来解析Url中的短语: 但是我怀疑http_open/3所提供的流的种类有一些细微差别;我收到以下错误: ERROR: set_stream_position/2: stream `<stream>(0x7fee

我正在使用SWI Prolog
库(http/http\u open)
。“在[
http\u open(Url,Stream,[])
]成功后,可以从流中读取数据。”因此,我想也许我可以通过使用
库(纯输入)
中的
phrase\u from\u Stream/2
装配一个简单的声明性谓词来解析Url中的短语:

但是我怀疑http_open/3所提供的流的种类有一些细微差别;我收到以下错误:

ERROR: set_stream_position/2: stream `<stream>(0x7feebbf5c810)' does not exist (Device not configured)
错误:设置\u流\u位置/2:stream`(0x7feebf5c810)`不存在(设备未配置)
(我已经针对
库(http/http\u open)
文档上提供的示例测试了相同的url,该文档使用
copy\u stream\u data/2
将输出传输到
user\u output
,并且可以工作。因此我知道url没有问题。)

我已经了解到,我可以将数据从url下载到字符串、代码列表或文本文件中,然后在上面使用我们的表亲
短语/n
。但我希望有人能告诉我

  • …使用DCGs解析url数据的优雅/标准解决方案
  • …也许有人会天真地希望,能够深入了解为什么我们不能在某些流上使用
    短语\u from\u stream/2

  • 目前,
    库(纯输入)
    不支持非重新定位流。这就是问题所在

    一种解决方法是阅读所有内容,然后在上面使用正常的
    短语。这当然与承诺的“懒散阅读”不同

    至于“解析URL中的数据”,请记住SWI Prolog为您在web上找到的许多内容提供了库:

    有关从html页面中选择文本的信息,请参见示例。相关代码位于
    scrap/3
    及其帮助谓词中。它使用SWI Prolog SGML/XML解析器和


    同时,如果您想使用DCG从非重新定位的流解析,那就太倒霉了<代码>库(纯输入)
    甚至不适用于标准输入。根据数据的结构,如果输入是按行组织的,您可以使用(参见示例),如果输入不是按行组织的,则可以读取到缓冲区。

    正如Boris指出的,非重新定位流不能与库一起使用(纯输入)。阅读\u stream\u to \u codes/2,然后是短语/2,这将为您提供一种实用的方法,根据真实数据测试语法


    但是,“真实世界”的HTML很难解析(即使有内置SGML解析器的支持),因为错误处理很差。因此,调试DCG可能是一场噩梦,即使在行为良好的语法上也是如此。

    完美!因此,这是一个与魔法启用库(纯输入)相关的怪癖。现在我知道了要搜索的术语,我看到Jan在tbd上有“支持非重新定位流,如套接字和管道”。非常感谢@一位考古学家tdb在那里已经有一段时间了。我唯一的希望是,除了Jan或Ulrich Neumerkel之外,其他人非常需要它来实际完成这项工作。@aBathologist如果你正在刮取s之类的东西,那么解析html和xpath就可以做得很好。请参阅此处的示例:相关代码位于
    scrap/3
    及其帮助谓词中。我假设他一定在解析其他内容。但是关于“真实世界”html,你是对的:斗争是真实的。谢谢,卡佩罗@Boris是正确的,我现在只是从URL抓取文本(最坏的情况是,删除
    等的内容。但了解“真实世界”的HTML处理很好。您提到的糟糕的错误处理显然是SWI的一部分?因此,我想最好是用其他语言解析HTML,然后在处理后将其传递回我的prolog…需要记住的事情。Thanks!@aBathologist根据我对Capelical答案的理解,现实世界的HTML很难解析,因为它通常使用的方式(结构和格式)。即使使用一个经过良好测试的正确解析器也很难;如果你尝试编写自己的语法,你真的会遇到问题(这是因为DCG调试有点困难。)@aBathologist:至少,在调试DCG时,我希望代码列表以可读的格式显示,以可视化“光标”。我尝试了绘制文本、设置序言标志(双引号、代码)等,但运气不好。。。
    ERROR: set_stream_position/2: stream `<stream>(0x7feebbf5c810)' does not exist (Device not configured)