Почему мой simple-html-dom разрешает, например, 'ä' для википедии, но не для вики-ресурса?
Моя проблема в том, что следующий скрипт работает с одними IRI, а с другими нет, и мой вопрос в том, почему он так себя ведет и как его решить. Я думаю, что есть проблема с кодировкой, но это только предположение, потому что в Википедии это работает.
<?php
include('C:\xampp\htdocs\php\simple_html_dom.php');
$html = file_get_html('http://de.wikisource.org/wiki/Am_B%C3%A4chle');
//Titel
foreach($html->find('span#ws-title') as $f)
echo $f->plaintext;
//1 http://de.wikisource.org/wiki/7._August_1929 OK
//2 http://de.wikisource.org/wiki/%E2%80%99s_ist_Krieg! -
//3 http://de.wikisource.org/wiki/Am_B%C3%A4chle -
//4 http://de.wikipedia.org/wiki/Guillaume-Aff%C3%A4re OK
//5 http://de.wikisource.org/wiki/Solidit%C3%A4t -
?>
5 IRI являются примерами. Последние 3 IRI содержат%C3%A4, это "ä", но работает только один из Википедии. 2. IRI содержит%E2%80%99, это "" - не работает.
Но первый IRI из викиресурса работает. То же самое для каждого IRI из вики-ресурса, который не содержит ни ä, ö, ...
Когда это не работает, я получаю следующее предупреждение:
Предупреждение: file_get_contents (http://de.wikisource.org/wiki/Solidit%C3%A4t): не удалось открыть поток: ошибка HTTP-запроса! HTTP/1.0 403 Запрещено в C:\xampp\htdocs\php\simple_html_dom.php в строке 70
Неустранимая ошибка: вызов функции-члена find() для необъекта в C:\xampp\htdocs\php\frage.php в строке 5
Функция, которая содержит строку 70 в simple_html_dom.php, выглядит так:
//65 function file_get_html($url, $use_include_path = false, $context=null, $offset = -1, $maxLen=-1, $lowercase = true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT)
//66 {
//67 // We DO force the tags to be terminated.
//68 $dom = new simple_html_dom(null, $lowercase, $forceTagsClosed, $target_charset, $defaultBRText);
//69 // For sourceforge users: uncomment the next line and comment the retreive_url_contents line 2 lines down if it is not already done.
//70 $contents = file_get_contents($url, $use_include_path, $context, $offset);
//71 // Paperg - use our own mechanism for getting the contents as we want to control the timeout.
//72 // $contents = retrieve_url_contents($url);
//73 if (empty($contents))
//74 {
//75 return false;
//76 }
//77 // The second parameter can force the selectors to all be lowercase.
//78 $dom->load($contents, $lowercase, $stripRN);
//79 return $dom;
//80 }
Есть ли способ заставить скрипт работать для каждого IRI в Википедии или Викитека? (Я знаю, что не всегда span#ws-title
это не моя проблема.)
2 ответа
Отличный вопрос!:)
Кажется, они фильтруются по пользовательскому агенту, попробуйте что-то вроде
<?php
ini_set("user_agent", "Descriptive user agent string");
file_get_contents("http://de.wikisource.org/wiki/".urlencode("Am_Bächle"));
?>
Вы, вероятно, можете пропустить часть urlencode, так как я просто использовал ее для проверки правильности кодирования.
Обратите внимание, что вики-ресурс явно не любит автоматический анализ их содержимого на веб-страницах. Тем не менее, для викиботов и т. П. Может быть доступен API, спросите их или поищите на страницах сообщества. API будет намного легче обрабатывать в любом случае.
Проблема не связана с символами или кодировкой. Вы получаете 403 из-за политики агента пользователя Викимедиа, которая гласит:
Скрипты должны использовать информативную строку User-Agent с контактной информацией, или они могут быть заблокированы IP без уведомления.
Вот что вам следует сделать: установить заголовок User-Agent на то, что идентифицирует ваше приложение и может быть использовано для связи с вами в случае возникновения проблем.
При этом прямой доступ к страницам, вероятно, является наихудшим способом получить желаемую дату. Вместо этого вам следует использовать API или, если вы хотите получить доступ ко многим страницам, дампы базы данных.