Программно чтение веб-страницы

Примечание: попытка получить свойство ошибки, отличной от объекта

Случается, когда вы пытаетесь получить доступ к объекту объекта, пока нет объекта.

Типичный пример для non-object notice будет

$users = json_decode('[{"name": "hakre"}]');
echo $users->name; # Notice: Trying to get property of non-object

В этом случае $users представляет собой массив (а не объект), и он не имеет никаких свойств.

Это похоже для доступа к несуществующему индексу или ключу массива (см. Примечание: Undefined Index ).

Этот пример значительно упрощен. Чаще всего такое уведомление сигнализирует неконтролируемое возвращаемое значение, например. когда библиотека возвращает NULL, если объект не существует или просто неожиданное значение, отличное от объекта (например, в результате Xpath, структуры JSON с непредвиденным форматом, XML с неожиданным форматом и т. д.), но код не проверяет такой условие.

Поскольку эти не-объекты часто обрабатываются дальше, часто возникает фатальная ошибка при вызове метода объекта для не-объекта (см.: Неустранимая ошибка: вызов члену function ... на не-объекте ), останавливая скрипт.

Его можно легко предотвратить, проверив условия ошибки и / или переменную, соответствующую ожиданию. Здесь такое уведомление с примером DOMXPath:

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$divText = $result->item(0)->nodeValue; # Notice: Trying to get property of non-object

Проблема заключается в доступе к свойству nodeValue первого поля, пока он не был проверен, существует ли он или нет в $result коллекция. Вместо этого он платит, чтобы сделать код более явным, назначив переменные объектам, на которых работает код:

$result  = $xpath->query("//*[@id='detail-sections']/div[1]");
$div     = $result->item(0);
$divText = "-/-";
if ($div) {
    $divText = $div->nodeValue;
}
echo $divText;

Связанные ошибки:

32
задан Lightness Races with Monica 25 February 2012 в 13:25
поделиться

5 ответов

Взгляните на ВИХРЕВАЯ библиотека :

 #include <stdio.h>
 #include <curl/curl.h>

 int main(void)
 {
   CURL *curl;
   CURLcode res;

   curl = curl_easy_init();
   if(curl) {
     curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se");
     res = curl_easy_perform(curl);
      /* always cleanup */
    curl_easy_cleanup(curl);
   }
   return 0;
 }

BTW, если C++ строго не требуется. Я поощряю Вас пробовать C# или Java. Это намного легче и существует встроенный путь.

42
ответ дан philant 27 November 2019 в 20:20
поделиться

Существует свободная библиотека TCP/IP, доступная для Windows, который поддерживает HTTP и HTTPS - использование, это очень просто.

Окончательный TCP/IP

CUT_HTTPClient http;
http.GET("http://folder/file.htm", "c:/tmp/process_me.htm");    

можно также ПОЛУЧИТЬ файлы и сохранить их в буфере памяти (через CUT_DataSource производные классы). Вся обычная поддержка HTTP там - ПОМЕЩЕНА, ГОЛОВА, и т.д. Поддержка прокси-серверов является бризом, как защищенные сокеты.

4
ответ дан Rob 27 November 2019 в 20:20
поделиться

Вы не упоминаете платформы, таким образом, я даю Вам ответ для Win32.

Один простой способ загрузить что-либо с Интернета URLDownloadToFile с IBindStatusCallback набор параметра к NULL. Для создания функции более полезной интерфейс обратного вызова должен быть реализован.

4
ответ дан Johann Gerell 27 November 2019 в 20:20
поделиться

Можно сделать это с программированием сокета, но это хитро для реализации частей протокола, должен был надежно выбрать страницу. Лучше пользоваться библиотекой, как неон . Это, вероятно, будет установлено в большинстве дистрибутивов Linux. В соответствии с FreeBSD пользуются библиотекой выборки.

Для парсинга данных, потому что много страниц не используют допустимый XML, необходимо реализовать эвристику, не реальный находящийся в yacc синтаксический анализатор. Можно реализовать эти регулярные выражения использования или машину изменения состояния. Поскольку то, что Вы пытаетесь сделать, включает много эмпирических, Вы - более обеспеченное использование языка сценариев, как Perl. Из-за высокой сетевой задержки Вы не будете видеть разницы в производительности.

3
ответ дан Diomidis Spinellis 27 November 2019 в 20:20
поделиться

Попытайтесь пользоваться библиотекой, как QT, который может считать данные со всех концов сети и вытащить данные из xml документа. Это является примером того, как считать канал xml. Вы могли использовать канал eBay, например.

3
ответ дан Alexander Smirnov 27 November 2019 в 20:20
поделиться