Почему мой 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 или, если вы хотите получить доступ ко многим страницам, дампы базы данных.

Другие вопросы по тегам