在html/xhtml中解析RDFa?

arm*_*884 2 html xml perl parsing rdfa

在perl中使用RDF :: RDFa :: Parser模块来解析网站外的rdf数据.在带有!DOCTYPE HTML PUBLIC的网站上" - // W3C // DTD HTML 4.01 Transitional // EN">它可以工作,但在使用xhtml的网站上!DOCTYPE html PUBLIC" - // W3C // DTD XHTML 1.0 Transitional // EN "" http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">没有输出......

测试网站 - > http://www.filmstarts.de/kritiken/186918.html

use RDF::RDFa::Parser;

my $url     = 'http://www.filmstarts.de/kritiken/186918.html';
my $options = RDF::RDFa::Parser::Config->tagsoup;
my $rdfa    = RDF::RDFa::Parser->new_from_url($url, $options);

print $rdfa->opengraph('image');
print $rdfa->opengraph('description');
Run Code Online (Sandbox Code Playgroud)

tob*_*ink 5

(我是RDF :: RDFa :: Parser的作者.)

看起来RDFa解析器使用的HTML解析器在该页面上失败.(我也是有问题的HTML解析器的维护者,所以我不能把责任推到其他任何人身上!)因此,当RDFa解析开始时,它看到的只是一个空的DOM树.

该页面是非常可怕的无效XHTML,但我仍然希望HTML解析器能够做一个合理的工作.我已经为你提交了一份错误报告.

同时,解决方法可能是 RDF :: RDFa :: Parser 之外构建XML :: LibXML DOM树(可能使用libxml的内置HTML解析器?).您可以将该树直接传递给RDFa解析器:

use RDF::RDFa::Parser;
use LWP::Simple qw(get);

my $url     = 'http://www.filmstarts.de/kritiken/186918.html';
my $xhtml   = get($url);
my $dom     = somehow_build_a_dom_tree($xhtml);  # hand-waving!!
my $options = RDF::RDFa::Parser::Config->tagsoup;
my $rdfa    = RDF::RDFa::Parser->new($dom, $url, $options);

print $rdfa->opengraph('image');
print $rdfa->opengraph('description');
Run Code Online (Sandbox Code Playgroud)

我希望有所帮助!

更新:这是一个可能的实现somehow_build_a_dom_tree......

sub somehow_build_a_dom_tree {
    my $p = XML::LibXML->new;
    $p->recover_silently(1);
    $p->load_html( string => @_ );
}
Run Code Online (Sandbox Code Playgroud)