Я могу использовать Mojo::DOM и его селектора CSS3 для определения DOCTYPE документа HTML? В связи с моим другим вопросом, How should I process HTML META tags with Mojo::UserAgent?, где я хочу установить набор символов для документа, мне нужно знать, что посмотреть, и doctype sniffing, похоже, это способ сделать. HTML и HTML 5 имеют разные метатеги для кодировок в HTML, когда параметр документа переопределяет настройку сервера (или не устанавливает).Doctype sniffing с CSS3, и особенно с Mojo :: DOM
У меня нет проблем с выполнением задачи, так как я могу получить сырой ответ и играть с регулярными выражениями, чтобы посмотреть DOCTYPE. Since the browser DOMs seem to be able to get the DOCTYPE, я заражен идеей, что я должен ее получить. Однако отсутствие примеров приводит меня к мысли, что никто не делает это так, как я думаю, я должен это делать.
Я пробовал много глупых способы, но мой CSS кунг-фу является слабым:
use v5.20;
use feature qw(signatures);
no warnings qw(experimental::signatures);
use Mojo::DOM;
my $html = do { local $/; <DATA> };
my $dom = Mojo::DOM->new($html);
say "<title> is => ", $dom->find('head title')->map('text')->each;
say "Doctype with find is => ", $dom->find('!doctype')->map('text')->each;
say "Doctype with nodes is => ", $dom->[0];
__DATA__
<!DOCTYPE html>
<head>
<title>This is a title</title>
</head>
<body>
<h1>Level 1</h1>
</body>
</html>
Когда я дамп $dom
объекта, я вижу DOCTYPE в дереве:
$VAR1 = bless(do{\(my $o = bless({
'tree' => [
'root',
[
'text',
'',
${$VAR1}->{'tree'}
],
[
'doctype',
' html',
${$VAR1}->{'tree'}
],
Теперь, как сделать Я понял?
Не похоже на встроенный способ сделать это, так как doctype хранится на верхнем уровне дерева. Лучшее, что я мог придумать, это сделать: 'my% ugly_tree = @ {$ dom-> root-> tree}; my ($ doctype) = $ ugly_tree {doctype}; 'Но это может быть хрупким. – xxfelixxx
Тип doctype - это еще один узел, и вы можете использовать такие методы, как [child_nodes] (http://mojolicio.us/perldoc/Mojo/DOM#child_nodes), чтобы найти их. –