Анализ текста в скрытом блоке [дубликат]

Спасибо, очень изящный, я не помню, что max позволяет «ключ».

BTW, чтобы получить правильный ответ ('b'), он должен быть:

import operator
stats = {'a':1000, 'b':3000, 'c': 100}
max(stats.iteritems(), key=operator.itemgetter(1))[0]
1906
задан 25 revs, 16 users 27% 1 May 2018 в 10:33
поделиться

24 ответа

1727
ответ дан Graham C 17 August 2018 в 09:33
поделиться

Для HTML5 html5 lib был оставлен уже много лет. Единственная библиотека HTML5, которую я могу найти с недавними записями обновления и обслуживания, - это html5-php , который чуть больше недели назад был добавлен в бета 1.0.

16
ответ дан 2 revs, 2 users 67% 17 August 2018 в 09:33
поделиться

Сторонние альтернативы SimpleHtmlDom, которые используют DOM вместо String Parsing: phpQuery , Zend_Dom , QueryPath и FluentDom .

28
ответ дан 2 revs, 2 users 78% 17 August 2018 в 09:33
поделиться
  • 1
    Если вы уже скопировали мои комментарии, по крайней мере, соедините их правильно;) Это должно быть: Предлагаемые альтернативы третьей стороне SimpleHtmlDom , которые на самом деле используют DOM вместо String Parsing: phpQuery , Zend_Dom , QueryPath и FluentDom . – Gordon 7 September 2010 в 19:49
  • 2
    Хорошие ответы - отличный источник. [Д0] stackoverflow.com/questions/3606792/… – danidacar 8 September 2010 в 13:46

JSON и массив из XML в трех строках:

$xml = simplexml_load_string($xml_string);
$json = json_encode($xml);
$array = json_decode($json,TRUE);

Ta da!

6
ответ дан 2 revs, 2 users 86% 17 August 2018 в 09:33
поделиться

Advanced Html Dom - это простая замена HTML DOM , которая предлагает один и тот же интерфейс, но это DOM-based, что означает, что ни одна из связанных проблем с памятью не возникает.

Он также имеет полную поддержку CSS, включая расширения jQuery .

16
ответ дан 3 revs, 2 users 69% 17 August 2018 в 09:33
поделиться
  • 1
    У меня хорошие результаты из Advanced Html Dom, и я думаю, что это должно быть в списке в принятом ответе. Важная вещь, чтобы знать, хотя для тех, кто полагается на ее «Цель этого проекта заключается в замене замены на основе DOM для простой библиотеки html dom для PHP ... Если вы используете файл / str_get_html, тогда вам не нужно изменить что-либо. & quot; archive.is/QtSuj#selection-933.34-933.100 заключается в том, что вам может потребоваться внести изменения в код, чтобы учесть некоторые несовместимости. Я отметил четырех известных мне в вопросах github проекта. github.com/monkeysuffrage/advanced_html_dom/issues – ChrisJJ 16 November 2016 в 21:54

Для 1a и 2: я проголосовал бы за новый класс DOMCrawler класса Symfony ( DomCrawler ). Этот класс позволяет запросы, похожие на CSS Selectors. Взгляните на эту презентацию для реальных примеров: news-of-the-symfony2-world .

Компонент предназначен для автономной работы и может использоваться без Symfony.

Единственным недостатком является то, что он будет работать только с PHP 5.3 или новее.

54
ответ дан 3 revs, 3 users 53% 17 August 2018 в 09:33
поделиться
  • 1
    jQuery-css-запросы хорошо сказано, потому что есть некоторые вещи, которые отсутствуют в документации w3c, но присутствуют как дополнительные функции в jquery. – Nikola Petkanski 13 May 2013 в 13:40

Существует несколько причин не анализировать HTML с помощью регулярного выражения. Но, если у вас есть полный контроль над тем, какой HTML будет сгенерирован, вы можете сделать это с помощью простого регулярного выражения.

Выше это функция, которая анализирует HTML по регулярному выражению. Обратите внимание, что эта функция очень чувствительна и требует, чтобы HTML подчинялся определенным правилам, но он работает очень хорошо во многих сценариях. Если вы хотите простой синтаксический анализатор и не хотите устанавливать библиотеки, сделайте снимок:

function array_combine_($keys, $values) {
    $result = array();
    foreach ($keys as $i => $k) {
        $result[$k][] = $values[$i];
    }
    array_walk($result, create_function('&$v', '$v = (count($v) == 1)? array_pop($v): $v;'));

    return $result;
}

function extract_data($str) {
    return (is_array($str))
        ? array_map('extract_data', $str)
        : ((!preg_match_all('#<([A-Za-z0-9_]*)[^>]*>(.*?)</\1>#s', $str, $matches))
            ? $str
            : array_map(('extract_data'), array_combine_($matches[1], $matches[2])));
}

print_r(extract_data(file_get_contents("http://www.google.com/")));
7
ответ дан 3 revs, 3 users 69% 17 August 2018 в 09:33
поделиться

Я создал библиотеку с именем PHPPowertools / DOM-Query , которая позволяет обходить HTML5 и XML-документы так же, как и с jQuery.

Под капотом используется symfony / DomCrawler для преобразования селекторов CSS в селектора XPath .


Использование примера:

namespace PowerTools;

// Get file content
$htmlcode = file_get_contents('https://github.com');

// Define your DOMCrawler based on file string
$H = new DOM_Query($htmlcode);

// Define your DOMCrawler based on an existing DOM_Query instance
$H = new DOM_Query($H->select('body'));

// Passing a string (CSS selector)
$s = $H->select('div.foo');

// Passing an element object (DOM Element)
$s = $H->select($documentBody);

// Passing a DOM Query object
$s = $H->select( $H->select('p + p'));

// Select the body tag
$body = $H->select('body');

// Combine different classes as one selector to get all site blocks
$siteblocks = $body->select('.site-header, .masthead, .site-body, .site-footer');

// Nest your methods just like you would with jQuery
$siteblocks->select('button')->add('span')->addClass('icon icon-printer');

// Use a lambda function to set the text of all site blocks
$siteblocks->text(function( $i, $val) {
    return $i . " - " . $val->attr('class');
});

// Append the following HTML to all site blocks
$siteblocks->append('<div class="site-center"></div>');

// Use a descendant selector to select the site's footer
$sitefooter = $body->select('.site-footer > .site-center');

// Set some attributes for the site's footer
$sitefooter->attr(array('id' => 'aweeesome', 'data-val' => 'see'));

// Use a lambda function to set the attributes of all site blocks
$siteblocks->attr('data-val', function( $i, $val) {
    return $i . " - " . $val->attr('class') . " - photo by Kelly Clark";
});

// Select the parent of the site's footer
$sitefooterparent = $sitefooter->parent();

// Remove the class of all i-tags within the site's footer's parent
$sitefooterparent->select('i')->removeAttr('class');

// Wrap the site's footer within two nex selectors
$sitefooter->wrap('<section><div class="footer-wrapper"></div></section>');

[...]

Поддерживаемые методы:


  1. Переименовано 'select' , по понятным причинам
  2. Переименовано 'void', так как 'empty' является зарезервированным словом в PHP

ПРИМЕЧАНИЕ:

Библиотека также включает собственный автозагрузчик с нулевой конфигурацией для совместимых с PSR-0 библиотек. Приведенный пример должен работать из коробки без какой-либо дополнительной настройки. Кроме того, вы можете использовать его с композитором.

15
ответ дан 4 revs, 2 users 89% 17 August 2018 в 09:33
поделиться
  • 1
    Похож на правильный инструмент для работы, но не загружается для меня в PHP 5.6.23 в Worpress. Любые дополнительные указания о том, как правильно его включить? Включил его с помощью: define («BASE_PATH», dirname ( FILE )); define («LIBRARY_PATH», BASE_PATH. DIRECTORY_SEPARATOR. «lib / vendor»); требуется LIBRARY_PATH. DIRECTORY_SEPARATOR. 'Loader.php'; Loader :: init (массив (LIBRARY_PATH, USER_PATH)); в functions.php – lithiumlab 17 October 2016 в 11:30

Почему вы не должны и , когда вы должны использовать регулярные выражения?

Во-первых, обычное неправильное выражение: регулярные выражения не предназначены для «синтаксического анализа» ] HTML. Regexes может, однако, «извлечь» данные. Извлечение - это то, для чего они созданы. Основным недостатком выработки HTML-выражения в правильных инструментариях SGML или базовых синтаксических анализаторов XML является их синтаксическое усилие и различная надежность.

Считайте, что создание несколько надежного HTML-выражения regex:

<a\s+class="?playbutton\d?[^>]+id="(\d+)".+?    <a\s+class="[\w\s]*title
[\w\s]*"[^>]+href="(http://[^">]+)"[^>]*>([^<>]+)</a>.+?

является менее читаемым, чем простой эквивалент phpQuery или QueryPath:

$div->find(".stationcool a")->attr("title");

Существуют, однако, конкретные варианты использования, в которых они могут помочь.

  • Многие интерфейсы обхода DOM не показать комментарии HTML <!--, которые иногда являются более полезными якорями для извлечения. В частности, псевдо-HTML-вариации <$var> или SGML-остатки легко приручить с регулярными выражениями.
  • Часто регулярные выражения могут сохранять пост-обработку. Однако для HTML-объектов часто требуется ручное наблюдение.
  • И, наконец, для e чрезвычайно простых задач , таких как извлечение & lt; img src = urls, они на самом деле являются вероятным инструментом. Преимущество скорости по сравнению с синтаксическими анализаторами SGML / XML в основном просто необходимо для этих основных процедур извлечения.

Иногда даже желательно предварительно извлечь фрагмент HTML с использованием регулярных выражений /<!--CONTENT-->(.+?)<!--END-->/ и обработать остаток, используя более простые интерфейсы парсера HTML.

Примечание. У меня на самом деле есть это приложение , где я использую разбор XML и регулярные выражения альтернативно. На прошлой неделе разразился синтаксический анализ PyQuery, и регулярное выражение все еще работало. Да, странно, и я не могу объяснить это сам. Но так получилось. Поэтому, пожалуйста, не голосуйте за реальные соображения, потому что это не соответствует регулярному выражению = evil mem. Но давайте также не будем проголосовать за это слишком много. Это всего лишь побочный сигнал для этой темы.

137
ответ дан 4 revs, 2 users 98% 17 August 2018 в 09:33
поделиться
  • 1
    DOMComment может читать комментарии, поэтому нет причин использовать Regex для этого. – Gordon 6 September 2010 в 10:48
  • 2
    Инструменты SGML или синтаксические анализаторы XML не подходят для анализа HTML реального мира. Для этого подходит только выделенный HTML-парсер. – Alohci 6 September 2010 в 10:53
  • 3
    @Alohci DOM использует libxml и libxml имеет отдельный модуль парсера HTML, который будет использоваться при загрузке HTML с помощью loadHTML() , поэтому он может очень сильно загружать «реальный мир». (прочитанный сломанный) HTML. – Gordon 6 September 2010 в 10:57
  • 4
    Ну, просто комментарий о вашем «реальном рассмотрении» и т. Д. точка зрения. Конечно, существуют полезные ситуации для Regex при разборе HTML. И есть также полезные ситуации для использования GOTO. И есть полезные ситуации для переменных переменных. Таким образом, никакая конкретная реализация не является окончательно кодовым гнили для ее использования. Но это ОЧЕНЬ сильный предупреждающий знак. И средний разработчик вряд ли будет достаточно нюансирован, чтобы сказать разницу. Итак, как правило, Regex GOTO и Variable-Variables - все зло. Есть незловое использование, но это исключения (и редкие в этом) ... (ИМХО) – ircmaxell 7 September 2010 в 13:11
  • 5
    @mario: На самом деле, HTML может «правильно» обрабатываться с помощью регулярных выражений, хотя обычно требуется несколько из них, чтобы сделать справедливую работу синицей. Это просто королевская боль в общем случае. В конкретных случаях с четко определенным входом он граничит с тривиальным. Это те случаи, когда люди должны использовать регулярные выражения. Большие старые голодные сильные парсеры действительно то, что вам нужно для общих случаев, хотя не всегда понятно случайному пользователю, где рисовать эту линию. Какой бы код ни был проще и проще, выигрывает. – tchrist 21 November 2010 в 02:38

Существует много способов обработки HTML / XML DOM, о которых большинство уже упоминалось. Следовательно, я не буду пытаться их перечислить.

Я просто хочу добавить, что лично я предпочитаю использовать расширение DOM и почему:

  • iit делает оптимальным использование преимущественного преимущества базового кода C
  • - это OO PHP (и позволяет мне подклассифицировать его)
  • , это довольно низкий уровень (что позволяет мне использовать его как не- раздутый фундамент для более продвинутого поведения)
  • предоставляет доступ ко всем частям DOM (в отличие от, например, SimpleXml, который игнорирует некоторые из менее известных функций XML)
  • имеет синтаксис используемый для обхода DOM, который аналогичен синтаксису, используемому в собственном Javascript.

И хотя я пропускаю возможность использования селекторов CSS для DOMDocument, существует довольно простой и удобный способ добавления эта функция: подклассификация DOMDocument и добавление JS-подобных методов querySelectorAll и querySelector в ваш подкласс.

Для разбора селекторов я рекомендую использовать очень минималистический компонент CssSelector из рамки Symfony , Этот компонент просто переводит селектора CSS в селектора XPath, которые затем могут быть загружены в DOMXpath для получения соответствующего Nodelist.

Затем вы можете использовать этот (еще очень низкий уровень) подкласс в качестве основы для более классы высокого уровня, предназначенные, например. проанализируйте очень специфические типы XML или добавьте больше поведение, подобное jQuery.

Ниже приведен код моей библиотеки DOM-Query и использует описанную вами технику.

Для синтаксического анализа HTML:

namespace PowerTools;

use \Symfony\Component\CssSelector\CssSelector as CssSelector;

class DOM_Document extends \DOMDocument {
    public function __construct($data = false, $doctype = 'html', $encoding = 'UTF-8', $version = '1.0') {
        parent::__construct($version, $encoding);
        if ($doctype && $doctype === 'html') {
            @$this->loadHTML($data);
        } else {
            @$this->loadXML($data);
        }
    }

    public function querySelectorAll($selector, $contextnode = null) {
        if (isset($this->doctype->name) && $this->doctype->name == 'html') {
            CssSelector::enableHtmlExtension();
        } else {
            CssSelector::disableHtmlExtension();
        }
        $xpath = new \DOMXpath($this);
        return $xpath->query(CssSelector::toXPath($selector, 'descendant::'), $contextnode);
    }

    [...]

    public function loadHTMLFile($filename, $options = 0) {
        $this->loadHTML(file_get_contents($filename), $options);
    }

    public function loadHTML($source, $options = 0) {
        if ($source && $source != '') {
            $data = trim($source);
            $html5 = new HTML5(array('targetDocument' => $this, 'disableHtmlNsInDom' => true));
            $data_start = mb_substr($data, 0, 10);
            if (strpos($data_start, '<!DOCTYPE ') === 0 || strpos($data_start, '<html>') === 0) {
                $html5->loadHTML($data);
            } else {
                @$this->loadHTML('<!DOCTYPE html><html><head><meta charset="' . $encoding . '" /></head><body></body></html>');
                $t = $html5->loadHTMLFragment($data);
                $docbody = $this->getElementsByTagName('body')->item(0);
                while ($t->hasChildNodes()) {
                    $docbody->appendChild($t->firstChild);
                }
            }
        }
    }

    [...]
}

См. также Анализ XML-документов с помощью селекторов CSS создателем Symfony Фабьеном Потенцером по его решению создать компонент CssSelector для Symfony и как используйте его.

10
ответ дан 5 revs 17 August 2018 в 09:33
поделиться

phpQuery и QueryPath чрезвычайно похожи в репликации свободного API jQuery. Вот почему они - два из самых простых подходов к правильно анализируют HTML в PHP.

Примеры для QueryPath

В основном вы сначала создаете запрашиваемое дерево DOM из строки HTML:

 $qp = qp("<html><body><h1>title</h1>..."); // or give filename or URL

Результирующий объект содержит полное древовидное представление документа HTML. Он может быть пройден с использованием методов DOM. Но общий подход заключается в использовании селекторов CSS, например, в jQuery:

 $qp->find("div.classname")->children()->...;

 foreach ($qp->find("p img") as $img) {
     print qp($img)->attr("src");
 }

. В основном вы хотите использовать простые #id и .class или DIV селектор тэгов для ->find(). Но вы также можете использовать операторы XPath , которые иногда бывают быстрее. Также типичные методы jQuery, такие как ->children() и ->text() и особенно ->attr(), упрощают извлечение правильных фрагментов HTML. (И уже имеют свои SGML-объекты, декодированные.)

 $qp->xpath("//div/p[1]");  // get first paragraph in a div

QueryPath также позволяет вводить новые теги в поток (->append), а затем выводить и префикс обновленного документа (->writeHTML). Он может не только анализировать искаженный HTML, но также различные диалекты XML (с пространствами имен) и даже извлекать данные из микроформатов HTML (XFN, vCard).

 $qp->find("a[target=_blank]")->toggleClass("usability-blunder");

.

phpQuery или QueryPath?

Обычно QueryPath лучше подходит для манипулирования документами. В то время как phpQuery также реализует некоторые псевдо-AJAX-методы (только HTTP-запросы), более похожие на jQuery. Говорят, что phpQuery часто быстрее, чем QueryPath (из-за меньшего количества общих функций).

Для получения дополнительной информации о различиях см. это сравнение на машине обратного пути от tagbyte.org . (Оригинальный источник пропал без вести, так что вот ссылка интернет-архива. Да, вы все равно можете найти недостающие страницы, люди.)

И вот всеобъемлющее введение QueryPath .

Преимущества

  • Простота и надежность
  • Простые в использовании альтернативы ->find("a img, a object, div a")
  • Надлежащее удаление данных (по сравнению с регулярным выражением grepping)
126
ответ дан 5 revs, 3 users 83% 17 August 2018 в 09:33
поделиться

С помощью FluidXML вы можете запрашивать и выполнять итерацию XML с помощью селекторов XPath и CSS.

$doc = fluidxml('<html>...</html>');

$title = $doc->query('//head/title')[0]->nodeValue;

$doc->query('//body/p', 'div.active', '#bgId')
        ->each(function($i, $node) {
            // $node is a DOMNode.
            $tag   = $node->nodeName;
            $text  = $node->nodeValue;
            $class = $node->getAttribute('class');
        });

https://github.com/servo-php/fluidxml

9
ответ дан 8 revs, 2 users 95% 17 August 2018 в 09:33
поделиться

Вы можете попробовать использовать что-то вроде HTML Tidy , чтобы очистить любой «сломанный» HTML и преобразовать HTML в XHTML, который затем можно разобрать с помощью парсера XML.

14
ответ дан CesarB 17 August 2018 в 09:33
поделиться

QueryPath хорош, но будьте осторожны с состоянием отслеживания, если вы не понимаете, что это значит, это может означать, что вы тратите много времени на отладку, пытаясь выяснить, что произошло, почему код не работает.

Что это означает, что каждый вызов в результирующем наборе изменяет набор результатов в объекте, он не связан с цепочкой, как в jquery, где каждая ссылка является новым набором, у вас есть единый набор, который является результатом вашего запроса, и каждый вызов функции изменяет этот единственный набор.

, чтобы получить jquery-подобное поведение, вам нужно разветвиться до того, как вы выполните операцию фильтрации / модификации, означает, что он будет более точно отражать то, что происходит в jquery.

$results = qp("div p");
$forename = $results->find("input[name='forename']");

$results теперь содержит результирующий набор для input[name='forename'] НЕ исходный запрос "div p", это сильно меня подтолкнуло, что Я обнаружил, что QueryPath отслеживает фильтры и находит и все, что изменяет ваши результаты и сохраняет их в объекте. вам нужно сделать это вместо

$forename = $results->branch()->find("input[name='forname']")

, тогда $results не будет изменено, и вы можете повторно использовать результирующий набор снова и снова, возможно, кто-то, у кого гораздо больше знаний, может немного прояснить это, но это в основном похоже на то, что я нашел.

22
ответ дан Christopher Thomas 17 August 2018 в 09:33
поделиться

Просто используйте DOMDocument-> loadHTML () и выполняйте его. Алгоритм анализа XML в формате libxml довольно хорош и быстр, и, вопреки распространенному мнению, не задушивает искаженный HTML.

224
ответ дан Edward Z. Yang 17 August 2018 в 09:33
поделиться
  • 1
    Правда. И он работает с встроенными в PHP классами XPath и XSLTProcessor, которые отлично подходят для извлечения контента. – Kornel 27 November 2008 в 14:28
  • 2
    Для действительно искаженного HTML вы всегда можете запустить его через htmltidy, прежде чем передавать его DOM. Всякий раз, когда мне нужно очищать данные из HTML, я всегда использую DOM или, по крайней мере, simplexml. – Frank Farmer 13 October 2009 в 01:41
  • 3
    Другое дело с загрузкой искаженного HTML i, что было бы разумно вызвать libxml_use_internal_errors (true), чтобы предотвратить предупреждения, которые перестанут анализировать. – Husky 24 May 2010 в 18:51
  • 4
    Я использовал DOMDocument для разбора около 1000 html-источников (на разных языках, закодированных разными кодировками) без каких-либо проблем. Вы можете столкнуться с проблемами кодирования с этим, но они не являются непреодолимыми. Вам нужно знать 3 вещи: 1) loadHTML использует кодировку метатега для определения кодировки 2) # 2 может привести к некорректному обнаружению кодировки, если содержимое html не включает эту информацию. 3) неправильные символы UTF-8 могут отключить синтаксический анализатор. В таких случаях используйте комбинацию mb_detect_encoding () и Simplepie RSS Parser для кодирования / преобразования / удаления плохого кода символов UTF-8 для обходных решений. – Zero 19 September 2010 в 07:58
  • 5
    DOM действительно поддерживает XPath, посмотрите DOMXPath . – Ryan McCue 30 January 2012 в 04:59

Один общий подход, о котором я не упоминал здесь, заключается в том, чтобы запустить HTML через Tidy , который может быть настроен на выдачу гарантированного действительного XHTML. Затем вы можете использовать любую старую библиотеку XML.

Но к вашей конкретной проблеме вы должны взглянуть на этот проект: http://fivefilters.org/content-only/ - это модифицированная версия алгоритма Readability , который предназначен для извлечения только текстового содержимого (а не верхних и нижних колонтитулов) со страницы.

58
ответ дан Eli 17 August 2018 в 09:33
поделиться

Я создал библиотеку под названием HTML5DOMDocument, которая свободно доступна в https://github.com/ivopetkov/html5-dom-document-php

Она поддерживает запрос селекторов тоже, которые, я думаю, будут очень полезны в вашем случае. Вот пример кода:

$dom = new IvoPetkov\HTML5DOMDocument();
$dom->loadHTML('<!DOCTYPE html><html><body><h1>Hello</h1><div class="content">This is some text</div></body></html>');
echo $dom->querySelector('h1')->innerHTML;
1
ответ дан Ivo Petkov 17 August 2018 в 09:33
поделиться

Это звучит как хорошая задача описания технологии W3C XPath . Легко выразить такие запросы, как «вернуть все href атрибуты в тегах img, которые вложены в <foo><bar><baz> elements». Не являясь баффом PHP, я не могу сказать вам, в какой форме XPath может быть доступен. Если вы можете вызвать внешнюю программу для обработки HTML-файла, вы сможете использовать версию командной строки XPath. Для быстрого ввода см. http://en.wikipedia.org/wiki/XPath .

35
ответ дан Jens 17 August 2018 в 09:33
поделиться

Это, кстати, называется прокруткой экрана. Библиотека, которую я использовал для этого, - Простой HTML-парсер (/ g0).

51
ответ дан Joel Verhagen 17 August 2018 в 09:33
поделиться
  • 1
    Не строго верно ( ru.wikipedia.org/wiki/Screen_scraping#Screen_scraping ). Подсказка находится в «экране»; в описанном случае нет экрана. Хотя, по общему признанию, этот термин страдал от множества недавних злоупотреблений. – Bobby Jack 26 August 2010 в 18:24
  • 2
    Я не скрипит экран, содержимое, которое будет проанализировано, будет разрешено поставщиком контента в соответствии с моим соглашением. – RobertPitt 26 August 2010 в 18:30

Да, вы можете использовать simple_html_dom для этой цели. Однако я довольно много работал с simple_html_dom, особенно для веб-лома и обнаружил, что он слишком уязвим. Он выполняет основную работу, но я не буду рекомендовать ее в любом случае.

Я никогда не использовал завиток для этой цели, но то, что я узнал, заключается в том, что завиток может сделать работу намного эффективнее и намного более твердый.

Просьба проверить эту ссылку: выскабливание-сайты-с-завиток

22
ответ дан NANNAV 17 August 2018 в 09:33
поделиться
  • 1
    curl может получить файл, но он не будет анализировать HTML для вас. Это тяжелая часть. – cHao 21 November 2012 в 20:37

Я написал анализатор XML общего назначения, который может легко обрабатывать файлы GB. Он основан на XMLReader, и он очень прост в использовании:

$source = new XmlExtractor("path/to/tag", "/path/to/file.xml");
foreach ($source as $tag) {
    echo $tag->field1;
    echo $tag->field2->subfield1;
}

Вот github repo: XmlExtractor

16
ответ дан Paul Warelis 17 August 2018 в 09:33
поделиться

Структура Symfony имеет пакеты, которые могут анализировать HTML, и вы можете использовать стиль CSS для выбора DOMs вместо использования XPath .

307
ответ дан Peter Mortensen 17 August 2018 в 09:33
поделиться
  • 1
    Ну, во-первых, есть вещи, которые мне нужно подготовить для таких, как плохой код DOM, Invlid, а также анализ js против механизма DNSBL, это также будет использоваться для поиска вредоносных сайтов / контента, а также, поскольку я создал свой сайт вокруг рамки i они должны быть чистыми, читаемыми и хорошо структурированными. SimpleDim отлично, но код немного грязный – RobertPitt 26 August 2010 в 18:35
  • 2
    @Robert вы также можете проверить htmlpurifier.org на предмет безопасности. – Gordon 31 August 2010 в 08:40
  • 3
    У него есть одна действительная точка: simpleHTMLDOM трудно продлить, если вы не используете узор декоратора, который я нахожу громоздким. Я обнаружил, что shudder просто вносит изменения в основной класс (ы). – Erik 17 September 2010 в 22:46
  • 4
    То, что я сделал, это запустить мой html через аккуратный, прежде чем отправлять его в SimpleDOM. – MB34 23 April 2012 в 15:14
  • 5
    Я использую это сейчас, запуская его как часть проекта для обработки нескольких сотен URL-адресов. Это становится очень медленным, и регулярные тайм-ауты сохраняются. Это отличный скрипт для начинающих и интуитивно прост в освоении, но слишком простой для более продвинутых проектов. – luke_mclachlan 7 April 2016 в 14:53

Если вы знакомы с селектором jQuery, вы можете использовать ScarletsQuery для PHP

<pre><?php
include "ScarletsQuery.php";

// Load the HTML content and parse it
$html = file_get_contents('https://www.lipsum.com');
$dom = Scarlets\Library\MarkupLanguage::parseText($html);

// Select meta tag on the HTML header
$description = $dom->selector('head meta[name="description"]')[0];

// Get 'content' attribute value from meta tag
print_r($description->attr('content'));

$description = $dom->selector('#Content p');

// Get element array
print_r($description->view);

. Эта библиотека обычно занимает менее 1 секунды для обработки автономного html. Он также принимает недопустимые HTML или отсутствующие цитаты по атрибутам тегов.

0
ответ дан StefansArya 17 August 2018 в 09:33
поделиться

XML_HTMLSax довольно стабилен - даже если он больше не поддерживается. Другой вариант может заключаться в том, чтобы передать вам HTML через Html Tidy , а затем проанализировать его стандартными инструментами XML.

11
ответ дан troelskn 17 August 2018 в 09:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: