我为链接数据应用程序编写了以下代码,用于从内容类型为application/rdf-xml的网页中提取URI。
public static void test(String url) {
try {
Model read = ModelFactory.createDefaultModel().read(url);
System.out.println("to go");
StmtIterator si;
si = read.listStatements();
System.out.println("to go");
while(si.hasNext()) {
Statement s=si.nextStatement();
Resource r=s.getSubject();
Property p=s.getPredicate();
RDFNode o=s.getObject();
System.out.println(r.getURI());
System.out.println(p.getURI());
System.out.println(o.asResource().getURI());
}
}
catch(JenaException | NoSuchElementException c) {}
}但是对于输入
<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:ex="http://example.org/stuff/1.0/">
<rdf:Description rdf:about="http://www.w3.org/TR/rdf-syntax-grammar"
dc:title="RDF/XML Syntax Specification (Revised)">
<ex:editor>
<rdf:Description ex:fullName="Dave Beckett">
<ex:homePage rdf:resource="http://purl.org/net/dajobe/" />
</rdf:Description>
</ex:editor>
</rdf:Description>
</rdf:RDF>输出为:
Subject URI is http://www.w3.org/TR/rdf-syntax-grammar
Predicate URI is http://example.org/stuff/1.0/editor
Object URI is null
Subject URI is http://www.w3.org/TR/rdf-syntax-grammar
Predicate URI is http://purl.org/dc/elements/1.1/title
Website is read我需要在输出中的所有URI存在于该页面上,以建立一个RDF页面的网络爬虫。我需要在输出中的所有以下链接:
http://www.w3.org/TR/rdf-syntax-grammar
http://example.org/stuff/1.0/editor
http://purl.org/net/dajobe
http://example.org/stuff/1.0/fullName
http://www.w3.org/TR/rdf-syntax-grammar
http://purl.org/dc/elements/1.1/title发布于 2012-09-23 01:15:26
小错误:你的意思是application/rdf+xml (注意加号)。
不管怎样,你的问题很简单:
catch(JenaException | NoSuchElementException c) {}坏的!您遗漏了这里抛出的错误,并且输出被截断:
System.out.println(o.asResource().getURI());o并不总是一个资源,这将在三元组上中断
<http://www.w3.org/TR/rdf-syntax-grammar> dc:title "RDF/XML Syntax ..."因此,您需要防范这种情况:
if (o.isResource()) System.out.println(o.asResource().getURI());或者更具体的是:
if (o.isURIResource()) System.out.println(o.asResource().getURI());这将跳过您在ex:editor中看到的null输出。
现在写一千遍我不会吞下异常:-)
发布于 2012-09-23 00:32:31
不,您不了解RDF是用来做什么的。爬虫程序是一种用于检索在线内容并对其进行索引的程序。一个简单的爬虫可以提供一个超文本标记语言文档,它将下载(可能是递归地) <a>元素的href属性中提到的所有文档。
RDF充满了URL,因此您可能认为它是提供爬虫的完美工具,但不幸的是,RDF文档中的URL并不是用来检索其他文档的。示例:
这会是巧合吗?我不这样认为。事实是,RDF的目的是描述现实世界,碰巧它可以以XML形式序列化,但XML不是the only available serialization。
那么,URL在文档中的用途是什么呢?它们被用来命名为。你认识几个约翰?可能有几十个,还有几千个约翰...但是,如果我拥有域名example.com,我可以使用URL http://example.com/friends/John来引用我的朋友约翰。RDF可以通过两个URLs和一个字符串来描述您的朋友John在Abc大道123号工作。
"http://me.com/John" "http://me.com/works_at" "123, Abc avenue"这被称为三元组,其中包含的URL并不意味着指向可通过TCP套接字和理解HTTP协议的客户端检索的内容。请注意,您的朋友(John) 和谓词(在哪里工作)都通过URL在三元组中被引用。但是如果你在浏览器中尝试这些URL,你将什么也得不到。
我不知道您为什么要构建爬虫,以及它应该做什么,但RDF肯定不是您完成工作所需的。
https://stackoverflow.com/questions/12544134
复制相似问题