我编写了以下代码,用于从链接数据应用程序的内容类型为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页面构建Web爬网程序。 我需要输出中的所有以下链接:
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
答案 0 :(得分:2)
轻微错误:你的意思是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());
会跳过您在null
看到的ex:editor
输出。
现在写一千次我不会吞下异常: - )
答案 1 :(得分:1)
不,你不明白RDF的用途。爬虫是一种旨在检索在线内容并将其编入索引的程序。一个简单的爬虫可以提供HTML文档,它将下载(可能是递归地)href
元素的<a>
属性中提到的所有文档。
RDF充满了网址,因此您可能认为提供抓取工具非常理想,但遗憾的是,RDF文档中的网址并非用于检索其他文档。例子:
这可能是巧合吗?我不这么认为。事实上,RDF旨在描述现实世界,并且它可以以XML格式序列化,但XML不是the only available serialization。
那么,文档中使用的URL是什么?它们用来命名。你知道多少约翰?可能有几十个,还有数千个John存在......但是,如果我拥有域example.com
,我可以使用URL http://example.com/friends/John
来引用我的朋友John。 RDF可用于描述您的朋友John在123,Abc avenue工作,通过两个URL和一个字符串
"http://me.com/John" "http://me.com/works_at" "123, Abc avenue"
这被称为 triple ,其中包含的URL并不意味着可以通过TCP套接字和理解HTTP协议的客户端检索。请注意,您的朋友(John)和谓词(适用于)都通过URL在三元组中引用。但是如果你在浏览器中尝试这些网址,你什么也得不到。
我不知道你为什么要构建你的爬虫以及它应该做什么,但当然RDF并不是你需要做的工作。