I am looking to scrap a Chinese website using PHP and CURL. Earlier I had an issue with the compressed results and SO had helped me to sort it out.
Now I’m facing a trouble while parsing the contents through PHP — DOMDocument.
The error is as follows,
Warning: DOMDocument::loadHTML(): input conversion failed due to input error, bytes 0xE3 0x80 0x90 0xE8 in /var/www/html/ ..
Even though warning this is preventing from getting further results.
My code is as given below:
$agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL,$url);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('text/html; charset=gb2312'));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($curl, CURLOPT_ENCODING, ""); // handling all compressions
curl_setopt($curl, CURLOPT_USERAGENT, $agent);
curl_setopt($curl, CURLOPT_TIMEOUT, 1000);
$html = curl_exec($curl) or die("error: ".curl_error($curl));
curl_close($curl);
$htmlParsed = mb_convert_encoding($result,'utf-8','gb2312');
$doc = new DOMDocument();
$doc->loadHTML($htmlParsed);
$xpath = new DOMXpath($doc);
$elements = $xpath->query('//div[@class="test"]//a/@href');
if (!is_null($elements)) {
foreach ($elements as $element) {
echo "<br/>[". $element->nodeName. "]";
$nodes = $element->childNodes;
foreach ($nodes as $node) {
echo $node->nodeValue. "n";
}
}
}
I found the content type in my target website as ,
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
So I tried converting result to utf-8.
Since the input conversion fails at ‘DOMDocument::loadHTML()’ line of the code ,I can’t parse the web page to get the results.
I am currently stuck at this point and any help or suggestions will be highly appreciated. Thanx in advance.
(Earlier I used to work with simple HTML DOM parser,which was pretty simple.But later after reading the cons in SO regarding its usage.I planned to switch to PHP’s native DOM Parser )
Содержание
- О неочевидных ошибках функции loadXML() – PHP
- Какие могут быть у нее ошибки?
- 1. Некорректный XML
- 2. Несоответствие кодировок
- Input conversion failed due to input error bytes 0x98 0xd0 0xb4 0xd0
О неочевидных ошибках функции loadXML() – PHP
Функция loadXML() в языке РНР производит загрузка XML из строки – так сказано в мануалах по PHP. Она возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки. Если вызвана статически, возвращает объект класса DOMDocument или FALSE в случае возникновения ошибки.
Какие могут быть у нее ошибки?
Мануал сообщает лишь о некоторых видах ошибок:
Из комментариев в мануалу можно прочитать еще о возможных проблемах с функцией loadXML():
И, в общем-то, всё. Там, однако, НЕ указан еще один важнейший класс ошибок, которые могут быть допущены при работе с loadXML():
Надо сказать, что это – и не мудрено, что не указано. Дело в том, что такая ошибка – достаточно нетипичная, редкая и потому – очень трудно ее отловить (скажем, типичные автоматизированные тесты, скорее всего, не выявят ее). И тем она – коварнее. Но, увы, именно она может «почему-то» вызвать капитальный сбой в работе сайта.
Ниже мы рассмотрим подробно два вида ошибок: ввода некорректного XML и несоответствие кодировок.
1. Некорректный XML
Виды некорректного XML могут быть подразделены на два основных:
Формат html-тегов может быть неверным, к примеру, если не закрыт тот или иной тег; или если тег сам по себе написан неверно. Вот типичные примеры неверных тегов, исходя из стандарта XML:
(этот тег – самозакрывающийся и должен быть написан так:
)
(присутствует пробел там, где его быть не должно)
(присутствуют лишние пробелы)
HTML-сущности имеют два формата написания:
Следует заметить, что и то, и другое описание имеет характерные признаки: начинается с символа & (амперсанд) и оканчивается ; (точка с запятой). Между ними могут быть либо латинские буквы, либо знак # и цифры. Однако, далеко НЕ ВСЕ буквы и цифры допустимы. В частности, существуют некорректные (недопустимые) html-сущности. Например, сущность ©f; — недопустима (в отличие от © ). Точно также и с цифрами – отнюдь не любое их сочетание является допустимым (корректным).
Так вот, если на вход функции loadxml() подать строку, содержащую некорректные теги или некорректную html-сущность, будет сгенерировано предупреждение, при этом результатом этой функции будет, как уже говорилось, FALSE. Т.е. создание DOM для такой строки не произойдет – со всеми вытекающими последствиями.
Например, хрестоматийным некорректным XML-кодом является символ одиночного амперсанда & . Вместо этого следует использовать & . Т.е. сам по себе амперсанд допустим в XML-коде только в составе ДОПУСТИМЫХ html-сущностей. Иными словами, если Вы решили передать во входную строку функции loadxml() , к примеру, программный код вида
то необходимо превратить в корректные html-сущности амперсанды, которые, по крайней мере, не являются началом тех или иных html-сущностей. Т.е. этот код перед передачей функции loadxml() нужно будет преобразовать следующим образом:
Увы. Да, длинновато получится, но зато – будет работать без проблем в качестве аргумента этой функции.
Ну, с некорректным XML-кодом, вроде бы, всё ясно. Переходим ко второму виду ошибок, пока еще НЕ описанных в мануалах и иных руководствах.
2. Несоответствие кодировок
Посмотрим типичный пример применения функции loadxml() :
Источник
Input conversion failed due to input error bytes 0x98 0xd0 0xb4 0xd0
alligator |
|
||
Опытный Профиль Репутация: 1 Всем доброго времени суток!
Warning: SimpleXMLElement::__construct(): Entity: line 1: parser error : switching encoding: encoder error in /var/www/portal.mikronika-energo.ru/htdocs/test/ssl/action.php on line 166 Warning: SimpleXMLElement::__construct(): in test.php on line 166 Warning: SimpleXMLElement::__construct(): ^ in test.php on line 166 Warning: SimpleXMLElement::__construct(): Entity: line 1: parser error : Blank needed here in test.php on line 166 Warning: SimpleXMLElement::__construct(): in test.php Warning: SimpleXMLElement::__construct(): ^ test.php Warning: SimpleXMLElement::__construct(): Entity: line 1: parser error : parsing XML declaration: ‘?>’ |
Aliance |
|
||
I ♥ $ch = curl_init(); |
Aliance |
|
||
I ♥ |
alligator |
|
||||||||
Опытный Профиль Репутация: 1
Везде UTF-8 и simplexml нормально отрабатывает на них хотя в коде encoding=windows-1251
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, [email protected] , skyboy, SamDark, MoLeX, awers.
[ Время генерации скрипта: 0.1095 ] [ Использовано запросов: 21 ] [ GZIP включён ] Источник Adblock |
-
#1
XMLReader ругается на кодировку? ( input conversion failed due to input error )
Парсю xml, но в одном месте XMLReader ругается input conversion failed due to input error, bytes 0x98 0x62 0x61 0x72
Визуально видно — что то с кодировкой в тэге «description» (там где «a?_barbaric-Bihar»), но что именно с ней?
Кто виноват — xml или код ?
Если код — то можно все же заставить XMLreader корректно считать эти данные?
Или придется смирится с пропуском этих данных?
xml файл http://stream.ifolder.ru/15015858
Код:
PHP:
<?
$reader = new XMLReader();
$reader->open("test.xml");
while ($reader->read()){
}
?>
-
#2
А что, если не ридер использовать, а SimpleXML или DOM? Файл не такой уже и большой, чтобы на него натравливать XMLReader.
-
#3
Это я привел отрывок из большого файла xml весом под 200 Мегабайт.
-
#4
А XMLReader гарантирует только поддержку UTF8, а файлик то WIN-1251, судя по заголовку…
Пробуй перекодировать, перед тем как скармливать…
I am looking to scrap a Chinese website using PHP and CURL. Earlier I had an issue with the compressed results and SO had helped me to sort it out.
Now I’m facing a trouble while parsing the contents through PHP — DOMDocument.
The error is as follows,
Warning: DOMDocument::loadHTML(): input conversion failed due to input error, bytes 0xE3 0x80 0x90 0xE8 in /var/www/html/ ..
Even though warning this is preventing from getting further results.
My code is as given below:
$agent = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL,$url);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('text/html; charset=gb2312'));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($curl, CURLOPT_ENCODING, ""); // handling all compressions
curl_setopt($curl, CURLOPT_USERAGENT, $agent);
curl_setopt($curl, CURLOPT_TIMEOUT, 1000);
$html = curl_exec($curl) or die("error: ".curl_error($curl));
curl_close($curl);
$htmlParsed = mb_convert_encoding($result,'utf-8','gb2312');
$doc = new DOMDocument();
$doc->loadHTML($htmlParsed);
$xpath = new DOMXpath($doc);
$elements = $xpath->query('//div[@class="test"]//a/@href');
if (!is_null($elements)) {
foreach ($elements as $element) {
echo "<br/>[". $element->nodeName. "]";
$nodes = $element->childNodes;
foreach ($nodes as $node) {
echo $node->nodeValue. "n";
}
}
}
I found the content type in my target website as ,
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
So I tried converting result to utf-8.
Since the input conversion fails at ‘DOMDocument::loadHTML()’ line of the code ,I can’t parse the web page to get the results.
I am currently stuck at this point and any help or suggestions will be highly appreciated. Thanx in advance.
(Earlier I used to work with simple HTML DOM parser,which was pretty simple.But later after reading the cons in SO regarding its usage.I planned to switch to PHP’s native DOM Parser )
За последние 24 часа нас посетили 11584 программиста и 1152 робота. Сейчас ищут 218 программистов …
-
- С нами с:
- 4 авг 2015
- Сообщения:
- 22
- Симпатии:
- 0
Здравствуйте! Хочу спарсить в свой интернет-магазин товары с сайта поставщика.
Можете пожалуйста показать на примере как это делается?
допустим как добавить в свою базу данных название модели, цену, размер. как сохранить картинки на локальный сервер в определенную папку? (движок самописный у меня)
xml файл — http://www.glem.com.ua/eshop/ym4.phpи еще такой вопрос, на их сайте написано:
Подключив импорт из xml вы получите:
Новые позиции будут создаваться на вашем сайте автоматически.
Позиции, закончившиеся на нашем складе (не осталось ни одного размера) автоматически скроются и на вашем сайте.
Если эти позиции отошьются и опять появятся у нас на складе, то они автоматически появятся и у вас на сайте.как это все осуществляется? Заранее всем спасибо за ответы.
-
Команда форума
МодераторВсё есть в книгах для начинающих по PHP, смотри главу про XML
-
- С нами с:
- 4 авг 2015
- Сообщения:
- 22
- Симпатии:
- 0
читал целый день сегодня, сложно сразу вникнуть когда до этого не работал с xml..
-
Команда форума
Модератор- С нами с:
- 20 июн 2012
- Сообщения:
- 8.493
- Симпатии:
- 1.732
-
- С нами с:
- 4 авг 2015
- Сообщения:
- 22
- Симпатии:
- 0
Кто-то может на моем примере показать? Я не прошу все данные парсить, только пример. Остальное я сам допишу.
и еще такой вопрос, на их сайте написано:
Подключив импорт из xml вы получите:
Новые позиции будут создаваться на вашем сайте автоматически.
Позиции, закончившиеся на нашем складе (не осталось ни одного размера) автоматически скроются и на вашем сайте.
Если эти позиции отошьются и опять появятся у нас на складе, то они автоматически появятся и у вас на сайте.как это все осуществляется? Заранее всем спасибо за ответы.
-
Команда форума
МодераторИмея эти данные такое можно реализовать, тут просто логика. Реализовать это можно с помощью программы.
Если нужно получить готовый код, то можно написать в раздел «сделайте за меня» бесплатно или «free-lance» за деньги.
-
- С нами с:
- 4 авг 2015
- Сообщения:
- 22
- Симпатии:
- 0
С помощью какой программы? поставить парсер на крон?
Я не прошу все данные парсить, только пример. Остальное я сам допишу.. -
- С нами с:
- 4 авг 2015
- Сообщения:
- 22
- Симпатии:
- 0
спасибо за ответы! Так все и предполагал.. База у меня давно готова. Можно пример как спарсить в свою базу данных хотя-бы названия моделей и цены? и как сохранить картинки на локальный сервер в определенную папку?
-
- С нами с:
- 4 авг 2015
- Сообщения:
- 22
- Симпатии:
- 0
по тем примерам не совсем понятно мне как это реализовать. Опыт еще не такой большой в php. С картинками думаю разберусь. но как спарсить хотя-бы названия моделей и цены?
-
Команда форума
Модератор- С нами с:
- 20 июн 2012
- Сообщения:
- 8.493
- Симпатии:
- 1.732
С таким уровнем знаний сами не справитесь. Тогда ищите фрилансера
-
- С нами с:
- 4 авг 2015
- Сообщения:
- 22
- Симпатии:
- 0
может и разберусь. можете дать пример как спарсить хотя-бы названия моделей и цены?
-
Команда форума
Модераторпримерно так
-
foreach ($xml->shop->offers as $offer) {
-
-
- С нами с:
- 4 авг 2015
- Сообщения:
- 22
- Симпатии:
- 0
-
include ‘simple_html_dom.php’;
-
$xml = new SimpleXMLElement($xmls);
-
foreach ($xml->shop->offers as $offer) {
выбивает Warning: SimpleXMLElement::__construct()
-
Maputo
Активный пользователь- С нами с:
- 30 июл 2015
- Сообщения:
- 1.136
- Симпатии:
- 173
А так:
-
$xml = new SimpleXMLElement($xmls, NULL, true);
-
- С нами с:
- 4 авг 2015
- Сообщения:
- 22
- Симпатии:
- 0
-
Maputo
Активный пользователь- С нами с:
- 30 июл 2015
- Сообщения:
- 1.136
- Симпатии:
- 173
Создайте простенький xml-документ. Протестируйте на нем.
и можно весь текст ошибки целиком.
На всякий случай версию PHP -
- С нами с:
- 4 авг 2015
- Сообщения:
- 22
- Симпатии:
- 0
Warning: SimpleXMLElement::__construct() [simplexmlelement.—construct]: input conversion failed due to input error, bytes 0x98 0x2C 0x20 0xD0 in
Fatal error: Uncaught exception ‘Exception’ with message ‘String could not be parsed as XML’ in
Версия PHP 5.3 -
Maputo
Активный пользователь- С нами с:
- 30 июл 2015
- Сообщения:
- 1.136
- Симпатии:
- 173
Что-то не так у Вас с файлом.
-
$xml = new SimpleXMLElement(‘r.xml’, NULL, true);
-
echo $xml->title.‘<br>’; // Выводит XLEBUSHEK
-
foreach($xml->composition->ingredient as $x){
-
echo $x .‘<br>’; //Выводит всякую фигню
Документ r.xml (взял из Вики)
-
<?xml version=«1.0» encoding=«UTF-8»?>
-
<recipe name=»хлеб» preptime=»5min» cooktime=»180min»>
-
<ingredient amount=»3″ unit=»стакан»>Мука</ingredient>
-
<ingredient amount=»0.25″ unit=»грамм»>Дрожжи</ingredient>
-
<ingredient amount=»1.5″ unit=»стакан»>Тёплая вода</ingredient>
-
<ingredient amount=»1″ unit=»чайная ложка»>Соль</ingredient>
-
Смешать все ингредиенты и тщательно замесить.
-
Закрыть тканью и оставить на один час в тёплом помещении.
-
Почитать вчерашнюю газету.
-
— это сомнительный шаг…
-
Замесить ещё раз, положить на противень и поставить в духовку.
А ошибка связана с кодировкой. У меня такая же вылетела, когда я текст из этого поста скопировал.
-
- С нами с:
- 4 авг 2015
- Сообщения:
- 22
- Симпатии:
- 0
-
$xml = simplexml_load_file(‘http://www.glem.com.ua/eshop/ym4.php’);
-
foreach($xml->shop->offers->offer as $offer) {
-
echo $offer->name, ‘, размер: ‘, $offer->param[1], PHP_EOL;
спасибо за помощь! вроде разобрался.. сейчас пытаюсь все в базу занести..
Форум программистов Vingrad
Модераторы: skyboy, MoLeX, Aliance, ksnk |
Поиск: |
|
Опции темы |
alligator |
|
||
Опытный Профиль Репутация: 1
|
Всем доброго времени суток!
——————— Мои ресурсы: |
||
|
|||
Aliance |
|
||
I ♥ <script> Профиль
Репутация: 14
|
Код граббинга курлом и код самого парсинга приложить тоже бы не помешало =) ——————— • Все о событиях JAVA ≠ JavaScript |
||
|
|||
alligator |
|
||||
Опытный Профиль Репутация: 1
|
——————— Мои ресурсы: |
||||
|
|||||
Aliance |
|
||
I ♥ <script> Профиль
Репутация: 14
|
SimpleXMLElement плохо работает не с utf, пока что более изящное решение, чем замена кодировки не подскажу:
——————— • Все о событиях JAVA ≠ JavaScript |
||
|
|||
alligator |
|
||||||
Опытный Профиль Репутация: 1
|
Пробежался по всем сайтам включая этот:
Везде UTF-8 и simplexml нормально отрабатывает на них хотя в коде encoding=windows-1251 ——————— Мои ресурсы: |
||||||
|
|||||||
|
Правила форума «PHP» | |
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, [email protected], skyboy, SamDark, MoLeX, awers. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) |
0 Пользователей: |
« Предыдущая тема | PHP: Общие вопросы | Следующая тема » |