утилизация данных с использованием регулярных выражений и simplehtmldom - PullRequest
0 голосов
/ 13 августа 2011

Я пытаюсь удалить некоторые данные с этого сайта: http://laperuanavegana.wordpress.com/. на самом деле я хочу название рецепта и ингредиентов. ингредиенты находится внутри двух конкретных ключевых слов. я пытаюсь получить эти данные с помощью регулярных выражений и simplehtmldom. но он показывает полный текст HTML, а не только ингредиенты. вот мой код:

include_once('simple_html_dom.php');
$base_url = "http://laperuanavegana.wordpress.com/";

traverse($base_url);


function traverse($base_url)
{

    $html = file_get_html($base_url);
    $k1="Ingredientes";
    $k2="Preparación";
    preg_match_all("/$k1(.*)$k2/s",$html->innertext,$out);
    echo $out[0][0];
}

?>

На этой странице есть несколько ингредиентов. Я хочу их всех. поэтому с помощью preg_match_all () будет полезно, если кто-нибудь обнаружит ошибку в этом коде. заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 13 августа 2011

Когда вы уже используете анализатор HTML (даже такой плохой, как SimpleHtmlDom), почему вы тогда пытаетесь что-то испортить с помощью Regex?Это все равно, что использовать скальпель, чтобы открыть пациента, а затем вернуться к заостренной ложке для реальной операции.

Поскольку я твердо верю, что никто не должен использовать SimpleHtmlDom, потому что он имеет плохую кодовую базу и намного медленнее, чем libxmlОснованные на парсерах, вот как это сделать с родным расширением DOM PHP и XPath .XPath - это документы Regex или SQL для X (HT) ML.Изучите его, так что вам больше никогда не придется прикасаться к Regex для HTML.

$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTMLFile('https://laperuanavegana.wordpress.com/2011/06/11/ensalada-tibia-de-quinua-mango-y-tomate/');
libxml_clear_errors();

$recipe = array();
$xpath = new DOMXPath($dom);
$contentDiv = $dom->getElementById('content');
$recipe['title'] = $xpath->evaluate('string(div/h2/a)', $contentDiv);
foreach ($xpath->query('div/div/ul/li', $contentDiv) as $listNode) {
    $recipe['ingredients'][] = $listNode->nodeValue;
}
print_r($recipe);

Это выдаст:

Array
(
    [title] => Ensalada tibia de quinua, mango y tomate
    [ingredients] => Array
        (
            [0] => 250gr de quinua cocida tibia
            [1] => 1 mango grande
            [2] => 2 tomates
            [3] => Unas hojas de perejil
            [4] => Sal
            [5] => Aceite de oliva
            [6] => Vinagre balsámico
        )

)

Обратите внимание, что мы не анализируем http://laperuanavegana.wordpress.com/, а фактическийСообщение блога.Основной URL-адрес будет изменять содержание всякий раз, когда владелец блога добавляет новый пост.

Чтобы получить все Рецепты с главной страницы, вы можете использовать

$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTMLFile('https://laperuanavegana.wordpress.com');
libxml_clear_errors();
$contentDiv = $dom->getElementById('content');
$xp = new DOMXPath($dom);
$recipes = array();
foreach ($xp->query('div/h2/a|div/div/ul/li', $contentDiv) as $node) {
    echo
        ($node->nodeName === 'a') ? "\n# " : '- ',
        $node->nodeValue,
        PHP_EOL;
}

Это выдаст

# Ensalada tibia de quinua, mango y tomate
- 250gr de quinua cocida tibia
- 1 mango grande
- 2 tomates
- Unas hojas de perejil
- Sal
- Aceite de oliva
- Vinagre balsámico

# Flan de lúcuma
- 1 lúcuma grandota o 3 pequeñas
- 1/2 litro de leche de soja evaporada
…

и так далее

Такжесм.

3 голосов
/ 13 августа 2011

Вам нужно добавить знак вопроса там. Это делает шаблон несвязным - в противном случае потребуется все, начиная с первого $ k1 до последнего $ k2 на странице. Если вы добавите знак вопроса, он всегда будет принимать следующие $ k2.

preg_match_all("/$k1(.*?)$k2/s",$html->innertext,$out);
...