在HTML/XHTML中解析RDFa?

3
使用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');
1个回答

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');

我希望能够帮助您! 更新:以下是somehow_build_a_dom_tree的可能实现...
sub somehow_build_a_dom_tree {
    my $p = XML::LibXML->new;
    $p->recover_silently(1);
    $p->load_html( string => @_ );
}

谢谢,但是我应该如何构建DOM树?这里有一个使用HTML 4.01的工作链接 -> http://www.videoworld.de/DVD~179029~vw~30615/DVD-Verleih-Elysium.html 它完美地工作... - armin884

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接