- Парсинг HTML на PHP с использованием нативных классов
- Что такое синтаксический анализ и как его использовать?
- Важные DOM классы в PHP
- DOMDocument, узлы и элементы
- Узлы (Nodes)
- Элементы (Elements)
- Практические примеры
- Выбор по ID
- Выбор тега по его имени
- Найти элементы с определенным классом
- Извлечь ссылки со страницы
- Модификация и сохранение HTML
- Вставка нового HTML-элемента в документ
- Удаление элемента из документа
- Манипулирующие атрибуты
- Вывод
- Reading Html from Any Url in PHP
- Method 1 (Using file_get_contents)
- Method 2 (Using Curl)
- Comments
- Leave a Reply Cancel reply
- Advertisement
- Recent Posts
- How to Get City and State Name from Pincode in Flutter
- Flutter Mobile OTP Verification using Firebase with Getx Package
- Reading Html from Any Url in PHP
- Popular Posts
- Simple Ways of Getting Data from URL in PHP (Web Scraping)
- Get Content from URL using PHP file_get_contents()
- Get Content from URL using PHP DOMDocument class
- Get Content from URL using PHPQuery class
Парсинг HTML на PHP с использованием нативных классов
Как вы, возможно, знаете, PHP является популярным внутренним языком, который поддерживает многие популярные CMS, включая WordPress. Если вы вступаете в WordPress или PHP-разработку, вы найдете эту статью полезной.
Если мы хотим обработать данные HTML на сервере? В этой статье мы рассмотрим некоторые полезные классы PHP, которые позволяют нам обрабатывать HTML на стороне сервера.
Что такое синтаксический анализ и как его использовать?
Синтаксический анализ (в данном случае) — это процесс извлечения или изменения полезной информации из строки HTML или XML. Парсер дает нам простые способы запрашивать необработанные данные вместо использования регулярных выражений.
Предположим, вы хотите получить все ссылки на веб-странице. Классы синтаксического анализа PHP DOM могут вам помочь.
Важные DOM классы в PHP
В PHP около девятнадцати классов, связанных с DOM . Некоторые из важных:
DOMDocument, узлы и элементы
Это DOMDocument первый, чтобы упомянуть здесь. Он принимает HTML в качестве входных данных и возвращает объект, который предоставляет доступ к элементам DOM. Он может загружать HTML или XML из строки или файла. Класс определяет несколько методов, getElementById которые похожи на функции в Javascript.
$dom = new DOMDocument(); //examples //methods to load HTML $dom->loadHTML($html_string); $dom->loadHTMLFile('path/to/htmlfile.html'); //methods to load XML $dom->load('path/to/xmlfile.xml'); $dom->loadXML($xml_string); $documentElement = $dom->documentElement; //object of DOMElement Class which gives access to the document element
В этом посте мы в основном будем думать о манипулировании HTML поверх XML.
Узлы (Nodes)
DOM из HTML представляет собой древовидную структуру, состоящую из отдельных узлов. Эти узлы могут быть любого типа, например, элемент, текст, комментарий, атрибут и т. д. DOMNode Является базовым классом, от которого наследуются все типы классов узлов.
Элементы (Elements)
DOMElement Класс расширяет DOMNode класс , который может представлять элементы в HTML — разметке. Объектом DOMElement может быть любой элемент, такой как изображение, div, span, table и т. д.
Практические примеры
Не углубляясь в теории, давайте углубимся в некоторые практические примеры. Прежде всего, нам нужны некоторые данные HTML.
Мы будем выполнять следующие работы с нашим примером HTML:
- Выбрать элемент по идентификатору
- Получить элементы по имени тега
- Найти элементы по классу
- Найти все ссылки на странице
- Вставка HTML-элемента
- Удаление элемента
- Работа с атрибутами
header('Content-Type:application/json'); $url = "https://www.coralnodes.com/best-wordpress-image-optimization-plugins/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); $res = curl_exec($ch); curl_close($ch);
Переменная $res содержит весь HTML-код с веб-страницы.
Выбор по ID
Если вы посмотрите на наш образец страницы, вы увидите, что она содержит две таблицы. Предположим, я хочу найти количество строк в первой таблице. Используя chrome dev-tools, я обнаружил, что в требуемой таблице есть Id — #tablepress-3 .
$dom = new DomDocument(); @ $dom->loadHTML($res); $table = $dom->getElementById('tablepress-3'); //DOMElement $child_elements = $table->getElementsByTagName('tr'); //DOMNodeList $row_count = $child_elements->length - 1; echo "No. of rows in the table is " . $row_count;
Приведенный выше код дает вывод:
No. of rows in the table is 10
Выбор тега по его имени
И классы, DOMDocument и DOMElement классы имеют метод, getElementsByTagName() который позволяет нам выбирать элементы, используя имя тега. Например, если нам нужно получить все h2 заголовки со страницы, мы можем использовать эту функцию.
$dom = new DomDocument(); @ $dom->loadHTML($res); $h2s = $dom->getElementsByTagName('h2'); foreach( $h2s as $h2 ) < echo $h2->textContent . "\n"; >
Test Images Results after Compression ShortPixel reSmush.it Imagify TinyPNG Compress JPEG & PNG Images Kraken.IO EWWW Image Optimizer WP Smush Do you actually need a Plugin to Optimize Images? Consclusion
Найти элементы с определенным классом
В Javascript querySelectorAll() метод позволяет легко выбирать любые элементы с помощью селектора CSS. В PHP это не так просто. Вместо этого мы должны использовать DOMXpath класс для запроса и обхода дерева DOM.
Пример: выберите все таблицы с помощью класса tablepress.
$dom = new DomDocument(); @ $dom->loadHTML($res); $xpath = new DOMXpath($dom); $tables = $xpath->query("//table[contains(@class,'tablepress')]"); $count = $tables->length; echo "No. of tables " . $count;
Также как getElementByTagName() и query() метод DOMXpath возвращает DOMNodeList . Это принимает выражение в качестве аргумента. Это выражение XPath настолько универсально, что мы можем выполнять практически любые типы запросов.
Если вы новичок в XPath, это шпаргалка из Devhints.io содержит широкий перечень CSS и JS селекторов и их соответствующего XPath выражений. Это поможет вам найти подходящее выражение для запроса, который вы хотите выполнить.
Извлечь ссылки со страницы
Разбор открывает ряд возможностей. Извлечение ссылок с веб-страницы является одним из таких применений. Вот как сканеры сканируют всемирную паутину.
Предположим, я хочу найти все внешние ссылки на определенный веб-сайт на веб-странице. На нашем примере страницы я хотел бы найти все исходящие ссылки на сайт wordpress.org из поста в блоге. Итак, вот как я это сделал.
$dom = new DomDocument(); @ $dom->loadHTML($res); $links = $dom->getElementsByTagName('a'); $urls = []; foreach($links as $link) < $url = $link->getAttribute('href'); $parsed_url = parse_url($url); if( isset($parsed_url['host']) && $parsed_url['host'] === 'wordpress.org' ) < $urls[] = $url; >> var_dump($urls);
Модификация и сохранение HTML
До сих пор мы видели, как извлечь или выбрать необходимые данные из HTML. Теперь давайте посмотрим, как мы можем изменить его, добавив или удалив элементы и атрибуты.
Вставка нового HTML-элемента в документ
В этом примере мы увидим, как добавить изображение со ссылкой после первого абзаца. Так вы вставляете рекламные баннеры между постами.
$dom = new DomDocument(); @ $dom->loadHTML($html); $ps = $dom->getElementsByTagName('p'); $first_para = $ps->item(0); $html_to_add = ' '; $dom_to_add = new DOMDocument(); @ $dom_to_add->loadHTML($html_to_add); $new_element = $dom_to_add->documentElement; $imported_element = $dom->importNode($new_element, true); $first_para->parentNode->insertBefore($imported_element, $first_para->nextSibling); $output = @ $dom->saveHTML(); echo $output;
Обратите внимание, что saveHTML() метод возвращает измененную строку html.
Удаление элемента из документа
Чтобы удалить элемент из нашего HTML, мы можем использовать removeChild() метод из DOMElement класса.
$html = 'This is our first paragraph
Delete this This is our second paragraph
This is our third paragraph
Delete this too'; $dom = new DomDocument(); @ $dom->loadHTML($html); $documentElement = $dom->documentElement; echo $dom->saveHTML(); $xpath = new DOMXpath($dom); $elems = $xpath->query("//div[@class='del']"); foreach( $elems as $elem ) < $elem->parentNode->removeChild($elem); > echo '
-------after deletion--------
'; echo $dom->saveHTML();
Здесь мы выполнили запрос XPath, чтобы найти все элементы класса del . Затем мы удаляем каждый узел из документа, перебирая DOMNodeList объект с помощью foreach цикла.
This is our first paragraph Delete this This is our second paragraph This is our third paragraph Delete this too -------after deletion-------- This is our first paragraph This is our second paragraph This is our third paragraph
Манипулирующие атрибуты
Классы и идентификаторы — не единственные атрибуты, к которым мы можем получить доступ в PHP DOM. Класс DOMElement имеет несколько функций, которые могут получать, устанавливать или удалять атрибуты элемента. Эти методы выглядят аналогично Javascript. Так что вам будет легко понять.
- getAttribute($attribute_name) — получить значение атрибута
- setAttribute($attribute_name, $attribute_value) — установить значение атрибута
- hasAttribute($attribute_name) — проверяет, имеет ли элемент определенный атрибут и возвращает истину или ложь
$html = 'Content'; $dom = new DomDocument(); @ $dom->loadHTML($html); $elem = $dom->getElementsByTagName('span')->item(0); if( $elem->hasAttribute('data-action') ) < echo 'attribute value is "' . $elem->getAttribute('data-action') . '"'; $elem->setAttribute('data-action', 'hide'); echo '
updated attribute value is "' . $elem->getAttribute('data-action') . '"'; >
Вывод
До сих пор мы рассматривали некоторые важные API DOM в PHP. Я надеюсь, что это поможет вам начать разбирать данные HTML и XML с легкостью.
Reading Html from Any Url in PHP
Hello Friends, Today I am going to share very short and simple code which we can use to read html from any url in PHP. I am going to share two methods to achieve this, so let’s start without wasting time.
Method 1 (Using file_get_contents)
Method 2 (Using Curl)
Thanks friends
Your queries & suggestions are welcome in comments section
Please don’t forget to share if you find this helpful
I am a passionate Java Developer and I like Computer Programming. I love to do some interesting experiments and listening music in my free time.
Comments
Leave a Reply Cancel reply
Advertisement
Recent Posts
How to Get City and State Name from Pincode in Flutter
Flutter Mobile OTP Verification using Firebase with Getx Package
Reading Html from Any Url in PHP
Popular Posts
- Android Camera 2 Api Example With & Without Preview (22,741)
- Creating Calculator in JavaFX (20,125)
- Convert Number to Indian Currency in PHP (16,473)
- Convert Number to Indian Currency in Java (15,692)
- Keylogger in C/C++ (13,386)
Simple Ways of Getting Data from URL in PHP (Web Scraping)
When you need to get data / content from a certain website url (ie. for scrapping, data fetching, or something like that). There are 2 simple ways you can use. By using built-in php function file_get_contents() and using cURL library.
file_get_contents is so far the most simple way of getting data, but it lacks options if compared to cURL library. So decide wisely which method suits your need. If you just need to get a website content, then file_get_contents is the best choice. But if you need to do something more, like setting user agent, timeout, response type, error handling, or to access HTTPS URLs. cURL is the most capable.
Get Content from URL using PHP file_get_contents()
Getting data using file_get_contens() is as simple as :
$url="http://example.com"; $data=file_get_contents($url); echo $data; ?>
It basically fetch anything from given address, whether it’s a URL, or a file path. But for real-world implementation, every tcp connection does need some time to finish the request. In this case, the script would wait until the request processes finished (sending request, waiting, getting data) then continue the execution. If the connection is somehow failed, the script will keep continue so you will need to handle every possible outcome from the connection.
Get Content from URL using PHP DOMDocument class
Another way to fetch a web content in PHP is to use PHP DOMDocument class. In this method, we can directly process the retrieved document by DOM. The downside is, the content is only limited to HTML / XML. Usually, DOMDocument is already bundled in php so you don’t have to install anything.
Using DOMDocument is as simple as :
$dom = new DOMDocument(); libxml_use_internal_errors(true); $dom->loadHTMLFile('http://example.com/'); $data = $dom->getElementById("banner"); echo $data->nodeValue."\n" ?>
First, create a new DOMDocument object by
$dom = new DOMDocument();
Then load the HTML File using loadHTMLFile method with url as parameter.
$dom->loadHTMLFile(‘http://example.com/’);
Finally, access the DOM (you can read the docs here)
$dom->getElementById(«elementId»);
In real world, not ALL html document is well formed. Whether it’s an unclosed tags, mismatch brackets, malformed attribute-value pair, etc. Those will raise confuse DOMDocument causing it to throw an exception. To avoid that, we need to set
libxml_use_internal_errors(true);
to suppress libxml’s internal errors.
Get Content from URL using PHPQuery class
If you are familiar with how jquery works, this method is the best for you. This class library is originally created by Tobiasz Cudnik. This class implement css3 selector based on jquery javascript library.
By using PHPQuery class you can do something like:
$doc[‘ul > li’] ->addClass(‘active-list’);
Feels familiar?
You can find more example here.
Beside those three above, there are many more alternatives methods to acquire data from webpages in PHP. IMHO, those three above is the best ways i am already familiar with.