Description
Что значит th. Справочные данные по гиперболическим функциям – свойства, графики, формулы. Не переключайся: продолжение следует
Вы узнаете, как получить список всех статей, опубликованных на сайте.
Шаг 1. Подготовка
В первую очередь нужно скопировать библиотеку simpleHTMLdom , которая доступна на сайте
В архиве для загрузки хранятся несколько файлов, но вам нужен только один simple_html_dom.php . Все остальные файлы - это примеры и документация.
Шаг 2. Основы парсинга
Данную библиотеку очень просто использовать, но есть несколько основных моментов, которые следует изучить до того, как вы начнете приводить ее в действие.
$html = new simple_html_dom();// Загрузка из строки
$html->load("
Hello World!
");// Загрузка файла
$html->load_file("http://net.tutsplus.com/");
Вы можете создать исходный объект загрузив HTML либо из строки, либо из файла. Загрузка из файла может быть выполнена либо через указание URL , либо из вашей локальной файловой системы.
Примечания: Метод load_file() делегирует работу функции PHP file_get_contents . Если allow_url_fopen не установлен в значение true в вашем файле php.ini , то может отсутствовать возможность открывать удаленные файлы таким образом. В этом случае вы можете вернуться к использованию библиотеки CURL для загрузки удаленных страниц, а затем прочитать с помощью метода load() .
Доступ к информации
Как только у вас будет объект DOM, вы сможете начать работать с ним, используя метод find() и создавая коллекции. Коллекция - это группа объектов, найденных по селектору. Синтаксис очень похож на jQuery.
Hello World!
We"re Here.
В данном примере HTML мы собираемся разобраться, как получить доступ к информации во втором параграфе, изменить ее и затем вывести результат действий.
1. # создаем и загружаем HTML
2. include("simple_html_dom.php");
3. $html = new simple_html_dom();
4. $html->load(“
Hello World!
“);5. # получаем элемент представляющий второй параграф
6. $element = $html->find(“p“);
7. # модифицируем его
8. $element->innertext .= “ and we"re here to stay.“;
9. # Выводим!
10. echo $html->save();
Строки 2-4 : Загружаем HTML из строки, как объяснялось выше.
Строка 6 : Находим все тэги
В HTML, и возвращаем их в массив. Первый параграф будет иметь индекс 0, а последующие параграфы индексируются соответственно.
Строка 8 : Получаем доступ ко второму элементу в нашей коллекции параграфов (индекс 1), добавляем текст к его атрибуту innertext. Атрибут innertext представляет содержимое между тэгами, а атрибут outertext представляет содержимое включая тэги. Мы можем заменить тэг полностью, используя атрибут outertext.
Теперь добавим одну строку и модифицируем класс тэга нашего второго параграфа.
$element->class = "class_name";
echo $html->save();
Окончательный вид HTML после команды save будет иметь вид:
Hello World!
We"re here and we"re here to stay.
Другие селекторы
Несколько других примеров селекторов. Если вы использовали jQuery, все покажется вам знакомым.
# получаем первый найденный элемент с id=“foo“
$single = $html->find("#foo", 0);
# получаем все элементы с классом “foo“
$collection = $html->find(".foo");
# получаем все теги ссылок на странице
$collection = $html->find("a");
# получаем все теги ссылок, которые расположены внутри тега H1
$collection = $html->find("h1 a");
# получаем все теги img с title="himom"
$collection = $html->find("img");
Первый пример требует пояснений. Все запросы по умолчанию возвращают коллекции, даже запрос с ID, который должен вернуть только один элемент. Однако, задавая второй параметр, мы говорим “вернуть только первый элемент из коллекции”.
Это означает, что $single - единичный элемент, а не не массив элементов с одним членом.
Остальные примеры достаточно очевидны.
Документация
Полная документация по библиотеке доступна на .
Шаг 3. Пример из реального мира
Для демонстрации библиотеки в действии мы напишем скрипт для скрепинга содержимого сайта net.tutsplus.com и формирования списка заголовков и описания статей, представленных на сайте….только в качестве примера. Скрепинг относится к области трюков в веб, и не должен использоваться без разрешения владельца ресурса.
Include("simple_html_dom.php");
$articles = array();
getArticles("http://net.tutsplus.com/page/76/");
Начнем с подключения библиотеки и вызова функции getArticles с указанием страницы, с которой мы хотим начать парсинг.
Так же объявим глобальный массив, чтобы сделать проще сбор все информации о статьях в одном месте. Прежде чем начинать парсинг взглянем, как описывается статья на сайте Nettuts+.
Так представлен основой формат поста на сайте, включая комментарии исходного кода. Почему важны комментарии? Они подсчитываются парсером как узлы.
Шаг 4. Начало функции парсинга
function getArticles($page) {global $articles;
$html = new simple_html_dom();
$html->load_file($page);
// ... Дальше...
}
Начинаем с объявления глобального массива, создаем новый объект simple_html_dom , и затем загружаем страницу для парсинга. Данная функция будет рекурсивно вызываться, поэтому устанавливаем для нее в качестве параметра URL страницы.
Шаг 5. Находим ту информацию, которая нам нужна
1. $items = $html->find("div");
2. foreach($items as $post) {
3. # помним про учет комментариев в качестве узлов
4. $articles = array($post->children(3)->outertext,
5. $post->children(6)->first_child()->outertext);
6. }
Это суть функции getArticles . Нужно разобраться более детально, чтобы понять, что происходит.
Строка 1 : Создаем массив элементов - тег div с классом preview. Теперь у нас есть коллекция статей, сохраненная в $items .
Строка 4 : $post теперь ссылается на единичный div класса preview. Если мы взглянем в оригинальный HTML, то увидим, что третий элемент потомок - это тег H1 , который содержит заголовок статьи. Мы берем его и присваиваем $articles .
Помните о начале отсчета с 0 и учете комментариев исходного кода, когда будете определять правильный индекс узла.
Строка 5
: Шестой потомок $post
- это
$articles = “Заголовок статьи“; первым делом нужно определить, как найти следующую страницу. На сайте Nettuts+ о номере страницы очень легко догадаться по URL, но нам нужно получать ссылку в парсинге.
Если посмотреть на HTML, то можно найти следующее:
Это сслыка на следующую страницу, и мы можем легко ее найти по классу ‘nextpostslink
’. Теперь эта информация может быть использована.
If($next = $html->find("a", 0)) { В первой строке мы проверяем, можно ли найти ссылку с классом nextpostslink
. Отметим использование второго параметра в функции find()
. Таким образом мы указываем, что хотим получить первый элемент (индекс 0) в возвращаемой коллекции. $next
содержит единичный элемент, а не коллекцию.
Затем мы присваиваем ссылку HREF переменной $URL. Это важно, потому, что далее мы удаляем объект HTML. Чтобы предотвратить утечку памяти в php5, текущий объект simple_html_dom
должен быть очищен и разустановлен, прежде чем другой объект будет создан. Если этого не сделать, то вся доступная память может быть поглощена.
В завершение, мы вызываем функцию getArticles с URL следующей страницы. Рекурсия прерывается, когда не остается страниц для парсинга.
Первое, мы собираемся установить несколько основных стилей. Все абсолютно произвольно - вы можете устанавливать то, что нравится.
#main { Затем мы пишем маленькую функцию на PHP в странице для вывода предварительно сохраненной информации.
foreach($articles as $item) { Окончательный результат - это одна страница HTML со списком всех статей со страниц Nettuts+, начиная с той, которая была указана в первом вызове getArticles()
.
Если Вы запускаете парсинг для большого количества страниц (скажем, весь сайт), то это может занять много времени. На таком сайте как Nettuts+, который имеет боле 86страниц, процесс парсинга может длиться более минуты.
Данный урок открывает для вас тему парсинга HTML. Существуют другие методы методы работы с DOM, которые позволяют работать с селектором xpath для поиска элементов. Описанная в данном уроке библиотека проста для использования и отлично подходит для быстрого старта. Помните, что нужно спрашивать разрешения, прежде проводить скрепинг сайта.
В основном, для передачи параметров используются методы POST
и GET
. Тег создает на веб-странице кнопки и по своему действию напоминает результат, получаемый с помощью тега
(с параметром type="button | reset | submit"
). В отличие от этого тега, предлагает расширенные возможности по созданию кнопок. Например, на подобной кнопке можно размещать любые элементы HTML
, в том числе изображения. Используя стили, можно определить вид кнопки путем изменения шрифта, цвета фона, размеров и других параметров.
Кнопки с изображениями аналогичны по действию кнопке Submit
, но представляют собой рисунок. Для этого задаем type=image
и src="image.gif"
. Когда пользователь щелкнет где-нибудь на изображении, соответствующая форма будет передана на сервер с двумя дополнительными переменными – sub_x
и sub_y
. Они содержат координаты нажатия пользователя на изображение. Опытные программисты могут заметить, что на самом деле имена переменных, отправленных браузером, содержат точку, а не подчеркивание, но PHP
автоматически конвертирует точку в подчеркивание. Служит для отправки формы сценарию. При создании кнопки для отправки формы необходимо указать 2 атрибута: type="submit"
и value="Текст кнопки"
. Атрибут name необходим, если кнопка не одна, а несколько и все они созданы для разных операций, например кнопки "Сохранить", "Удалить", "Редактировать" и т.д. После нажатия на кнопку сценарию передается строка имя=текст кнопки.
При нажатии на кнопку сброса (reset
), все элементы формы будут установлены в то состояние, которое было задано в атрибутах по умолчанию, причем отправка формы не производиться.
Флажки checkbox предлагают пользователю ряд вариантов, и разрешает произвольный выбор (ни одного, одного или нескольких из них). Переключатели radio предлагают пользователю ряд вариантов, но разрешает выбрать только один из них. При создании обычного текстового поля размером size и максимальной допустимой длины maxlength
символов, атрибут type принимает значение text
. Если указан параметр value
, то поле будет отображать указанный в переменной value. При создании поля не забывайте указывать имя поля, т.к. этот атрибут является обязательным. Полностью аналогичен текстовому полю, за исключением того, что символы, набираемые пользователем, не будут отображаться на экране. Позволяет передавать сценарию какую то служебную информацию, не отображая её на странице. Тэг представляет собой выпадающий или раскрытый список, при этом одновременно могут быть выбраны одна или несколько строк. Но будет передано значение последней выбранной кнопке. Если необходимо создать выпадающий с предсказуемой последовательностью. Например, список с годами с 2000 по 2050. То используется следующий прием. Многострочное поле ввода текста позволяет отправлять не одну строку, а сразу несколько. При необходимости можно указать атрибут readonly
, который запрещает редактировать, удалять и изменять текст, т.е. текст будет предназначен только для чтения. Если необходимо чтобы текст был изначально отображен в многострочном поле ввода, то его необходимо поместить между тэгами
. Для того, чтобы в многострочном текстовом поле соблюдалось html-форматирование (перенос строк по средством тега Служит для реализации загрузки файлов на сервер. При создании текстового поля также необходимо указать тип поля type
как "file"
. Способов, предоставляемых протоколом HTTP
, немного. Это важная информация. Никаких других способов нет. На практике используются два: Чтобы передать данные методом GET
не надо создавать на HTML
-странице форму (использовать формы для запросов методом GET
вам никто не запрещает) – достаточно ссылки на документ с добавлением строки запроса, которая может выглядеть как переменная=значение. Пары объединяются с помощью амперсанда &, а к URL
страницы строка присоединяется с помощью вопросительного знака «?
». Передать данные методом POST
можно только с помощью формы на HTML
странице. Основное отличие POST
от GET
в том, что данные передаются не в заголовке запроса а в теле, следовательно, пользователь их не видит. Модифицировать можно только изменив саму форму. PHP
способен принимать файл, загружаемый при помощи любого браузера,. Это дает возможность загружать как текстовые, так и бинарные файлы. Вместе с PHP
-аутентификацией и функциями для работы с файловой системой, вы получаете полный контроль над тем, кому разрешено загружать файлы, и над тем, что делать с файлом после его загрузки. //Форма для загрузки файлов
В приведенном выше примере "URL
"
необходимо заменить ссылкой на PHP
-скрипт. Скрытое поле MAX
_FILE_SIZE
(значение необходимо указывать в байтах) должно предшествовать полю для выбора файла, и его значение является максимально допустимым размером принимаемого файла. Также следует убедиться, что в атрибутах формы вы указали enctype="multipart/form-data"
, в противном случае загрузка файлов на сервер выполняться не будет. Напрямую: Getenv("REQUEST_METHOD");
вернет GET
или POST
. Если форма служит для запроса некой информации, например – при поиске, то ее следует отправлять методом GET
. Чтобы можно было обновлять страницу, можно было поставить закладку и/или послать ссылку другу. Пример, для демонстрации отправки данных методом POST
и GET
одновременно и получения ответа от сервера.
$url = "http://test.ru/patch/file.php?var=23&var2=54";
$parse_url = parse_url($url);
$path = $parse_url["path"]; // путь до файла (/patch/file.php)
if($parse_url["query"]) // если есть список параметров
$path .= "?" . $parse_url["query"]; // добавляем (?var=23&var2=54)
$host= $parse_url["host"]; // тут получаем хост (test.ru)
$data = "var3=test&var4=".urlencode("еще тест");
$fp = fsockopen($host, 80, $errno, $errstr, 10);
if ($fp)
{
$out = "POST ".$path." HTTP/1.1\n";
$out .= "Host: ".$host."\n";
$out .= "Referer: ".$url."/\n";
$out .= "User-Agent: Opera\n";
$out .= "Content-Type: application/x-www-form-urlencoded\n";
$out .= "Content-Length: ".strlen($data)."\n\n";
$out .= $data."\n\n";
fputs($fp, $out); // отправляем данные
while($gets=fgets($fp,2048)) // читаем данные построчно и выводим их.
{
print $gets;
}
fclose($fp);
}
?> Не обязателен.
Результат данного примера показан на рис. 1. Рис. 1. Вид ячеек, оформленных с помощью стилей Каждая спецификация проходит несколько стадий одобрения. Особняком стоит живой стандарт HTML (Living
) - он не придерживается традиционной нумерации версий, поскольку находится в постоянной разработке и обновляется регулярно.
$articles = “This is my article description“
Шаг 6,
Работа со страницами
$URL = $next->href;
$html->clear();
unset($html);
getArticles($URL);
}Шаг 7. Вывод результатов
margin:80px auto;
width:500px;
}
h1 {
font:bold 40px/38px helvetica, verdana, sans-serif;
margin:0;
}
h1 a {
color:#600;
text-decoration:none;
}
p {
background: #ECECEC;
font:10px/14px verdana, sans-serif;
margin:8px 0 15px;
border: 1px #CCC solid;
padding: 15px;
}
.item {
padding:10px;
}
echo "
echo $item;
echo $item;
echo "
}
?>Шаг 8.
Заключение
Главное отличие методов POST
и GET
заключается в способе передачи информации. В методе GET
параметры передаются через адресную строку (URL
), т.е. в HTTP
-заголовке запроса, в то время как в методе POST
параметры передаются через тело HTTP
-запроса и никак не отражаются в адресной строке.1. Кнопки – Тег
Теоретически, тег должен располагаться внутри формы, устанавливаемой элементом . Тем не менее, браузеры не выводят сообщение об ошибке и корректно работают с тегом , если он встречается самостоятельно. Однако, если необходимо результат нажатия на кнопку отправить на сервер, помещать в контейнер обязательно. Закрывающий тег
обязателен.
Параметры:
disabled
– блокирует доступ и изменение элемента.
type
– тип кнопки
value
– Значение кнопки, которое будет отправлено на сервер или прочитано с помощью сприптов.
Параметр DISABLED
Блокирует доступ и изменение кнопки. Она в таком случае отображается серой и недоступной для активации пользователем. Кроме того, такая кнопка не может получить фокус путем нажатия на клавишу Tab
, мышью или другим способом. Тем не менее, такое состояние кнопки можно изменять через скрипты.
Определяет тип кнопки, который устанавливает ее поведение в форме. По внешнему виду кнопки разного типа никак не различаются, но у каждой такой кнопки свои функции. Значение по умолчанию: button
.
Аргументы:
button
– Обычная кнопка.
reset
– Кнопка для очистки введенных данных формы и возвращения значений в первоначальное состояние.Submit – Кнопка для отправки данных формы на сервер.
Параметр VALUE
Определяет значение кнопки, которое будет отправлено на сервер. На сервер отправляется пара «имя=значение
», где имя задается параметром name тега , а значение - параметром value
. Значение может, как совпадать с текстом на кнопке, так быть и самостоятельным. Также параметр value
применяется для доступа к данным через скрипты.
1.1. Кнопка (input type=button)
1.2. Кнопка с изображением (input type=image)
1.3. Кнопка отправки формы (input type=submit)
РНР
-сценарий не требуется.1.4. Массив кнопок (submit) для выбора варианта действий
2. Кнопка сброса формы (Reset)
РНР
-сценарий не требуется.3. Флажок (checkbox)
";
};
};
4. Переключатель(radio)
Пример 1.
Пример 2.
\n";
?>
5. Текстовое поле (text)
6. Поле для ввода пароля (password)
7. Скрытое текстовое поле (hidden)
8. Выпадающий список (select)
Список начинается с парных тегов
. Теги
позволяют определить содержимое списка, а параметр value
определяет значение строки. Если в теге указан параметр selected
, то строка будет изначально выбранной. Параметр size задает, сколько строк будет занимать список. Если size
равен 1
, то список будет выпадающим. Если указан атрибут multiple
, то разрешено выбирать несколько элементов из списка. Но эта схема практически не используется, а при size = 1
не имеет смысла.9. Многострочное поле ввода текста (textarea)
Существует параметр wrap
– задание переноса строк. Возможные значения:
off
– отключает перенос строк;
virtuals
– показывает переносы строк, но отправляет текст как он введен;
physical
– переносы строк оставляются в исходном виде.
По умолчанию тег создает пустое поле шириной в 20
символов и состоящее из 2
строк.
или
), то используйте функцию nl2br()
:10. Кнопка для загрузки файлов (browse)
Способы общения браузера с сервером
GET
– это когда данные передаются в адресной строке, например, когда пользователь жмет ссылку.
POST
– когда он нажимает кнопку в форме.Метод GET
Но можно не использовать пары ключ=значение, если надо передать всего одну переменную – для этого надо после знака вопроса написать ЗНАЧЕНИЕ
(не имя) переменной.
Преимущество
передачи параметров таким способом заключается в том, что клиенты, которые не могут использовать метод POST
(например, поисковые машины), все же смогут, просто пройдя по ссылке, передать параметры скрипту и получить содержимое.
Недостаток
в том, что просто изменив параметры в адресной строке, пользователь может повернуть ход сценария непредсказуемым образом и это создает огромную дыру в безопасности, в сочетании с неопределенными переменными и register_globals on
или кто-нибудь может узнать значение важной переменной (например ID
-сеcсии), просто посмотрев на экран монитора.
:
- для доступа к общедоступным страницам с передачей параметров (повышение функциональности)
- передача информации, не влияющей на уровень безопасности
:
- для доступа к защищенным страницам с передачей параметров
- для передачи информации, влияющей на уровень безопасности
- для передачи информации, не подлежащей модифицированию пользователем (некоторые передают текст SQL
-запросов.Метод POST
Преимущество
:
- большая безопасность и функциональность запросов с помощью форм методом POST
.
Недостаток
:
- меньшая доступность.
Для чего следует использовать
:
- для передачи большого объема информации (текст, файлы..);
- для передачи любой важной информации;
- для ограничения доступа (например, использовать для навигации только форму – возможность, доступная не всем программам-роботам или грабберам-контента).
Для чего не следует использовать
:
Страница для загрузки файлов может быть реализована при помощи специальной формы, которая выглядит примерно так:
Внимание
Опция MAX
_FILE_SIZE
является рекомендацией браузеру, даже если бы PHP
также проверял это условие. Обойти это ограничение на стороне браузера достаточно просто, следовательно, вы не должны полагаться на то, что все файлы большего размера будут блокированы при помощи этой возможности. Тем не менее, ограничение PHP
касательно максимального размера обойти невозможно. Вы в любом случае должны добавлять переменную формы MAX
_FILE_SIZE
, так как она предотвращает тревожное ожидание пользователей при передаче огромных файлов, только для того, чтобы узнать, что файл слишком большой и передача фактически не состоялась.Как определить метод запроса?
Какой способ следует применять?
Если же в результате отправки формы данные записываются или изменяются на сервере, то следует их отправлять методом POST
, причем обязательно, после обработки формы, надо перенаправить браузер методом GET
. Так же, POST
может понадобиться, если на сервер надо передать большой объём данных (у GET
он сильно ограничен), а так же, если не следует "светить" передаваемые данные в адресной строке (при вводе логина и пароля, например).
В любом случае, после обработки POST
надо всегда перенаправить браузер на какую-нибудь страницу, пусть ту же самую, но уже без данных формы, чтобы при обновлении страницы они не записывались повторно.Как передать данные в другой файл непосредственно из тела PHP
-программы методом GET
и POST
?
Закрывающий тег
Атрибуты
Пример
Браузер
Internet Explorer
Opera
Firefox
Версия
5.5
6.0
7.0
7.0
8.0
9.0
1.0
2.0
Поддерживается
Да
Да
Да
Да
Да
Да
Да
Да
Спецификация