简体   繁体   English

PHP简单HTML DOM查找

[英]PHP Simple HTML DOM lookup

I have been playing around with the PHP simple HTML DOM parser most of the day successfully. 大部分时间里,我一直在成功地使用PHP简单的HTML DOM解析器。 I now want to scrape text from a page which does not have clear identifiers down to the lowest level. 我现在想从没有清晰标识符的页面上抓取文字,直到最低级别。

I managed to bring it down to: 我设法将其归结为:

</pre><pre> </pre><p><strong>De heerlijke Pure Daghappen v</strong><strong>an Bistro Puur</strong></p> <p><strong>Voor de vaste lage prijs van&nbsp;slechts &euro; 8,50 !</strong></p> <p>geserveerd tussen 17:00 uur &amp; 18:30 uur</p> <p>&nbsp;</p> <h2>    <strong>De heerlijke Pure Daghappen voor week 32 zijn:</strong></h2> <p><strong><u>Dinsdag 22 Augustus:</u></strong></p> <p><strong>Gegrilde vakenshaas medaillons met champignonsaus</strong></p> <p>  <strong><u>Woensdag 23 Augustus:</u></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p> <p><strong>​Gekonfijte scharrelhoen bout met truffelsaus</strong></p> <p>   <strong><u>Donderdag 24 Augustus:&nbsp;</u></strong>&nbsp;&nbsp;</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;<br />  <strong>Gebakken zalmfilet met witte wijnsaus</strong></p> <p>  <strong><u>Vrijdag 25 Augustus;</u></strong></p> <p><strong>​In de oven gebakken kabeljauw filet met pesto saus</strong></p> <p>&nbsp;</p> <p>Alle heerlijke Pure Daghappen worden vergezeld door een aardappelgarnituur en een frisse salade.<br />    Daghap is exclusief bijpassende wijn.</p> <p>&nbsp;</p> <p><strong>Wij verwelkomen u graag!</strong></p> <p><em><strong>Team Bistro Puur</strong></em></p> <p class="rteindent1 rtecenter"><strong>&nbsp;</strong></p> an Bistro Puur

by using 通过使用

$html = file_get_html('http://www.bistropuur.nl/pure-daghappen');
foreach($html->find('div[class=node-content]') as $e){
    $temp = [$e->innertext];
} 

I subsequently want to create an array that contains all the different pieces of text to allow further manipulation towards something like: 随后,我想创建一个包含所有不同文本片段的数组,以允许对诸如以下内容的进一步操作:

$data = array[Dinsdag 22 Augustus, Gegrilde vakenshaas medaillons met champignonsaus, ....].

I tried the following: 我尝试了以下方法:

$html = '</pre><pre> </pre><p><strong>De heerlijke Pure Daghappen v</strong><strong>an Bistro Puur</strong></p> <p><strong>Voor de vaste lage prijs van&nbsp;slechts &euro; 8,50 !</strong></p> <p>geserveerd tussen 17:00 uur &amp; 18:30 uur</p> <p>&nbsp;</p> <h2>    <strong>De heerlijke Pure Daghappen voor week 32 zijn:</strong></h2> <p><strong><u>Dinsdag 22 Augustus:</u></strong></p> <p><strong>Gegrilde vakenshaas medaillons met champignonsaus</strong></p> <p>  <strong><u>Woensdag 23 Augustus:</u></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p> <p><strong>​Gekonfijte scharrelhoen bout met truffelsaus</strong></p> <p>   <strong><u>Donderdag 24 Augustus:&nbsp;</u></strong>&nbsp;&nbsp;</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;<br />  <strong>Gebakken zalmfilet met witte wijnsaus</strong></p> <p>  <strong><u>Vrijdag 25 Augustus;</u></strong></p> <p><strong>​In de oven gebakken kabeljauw filet met pesto saus</strong></p> <p>&nbsp;</p> <p>Alle heerlijke Pure Daghappen worden vergezeld door een aardappelgarnituur en een frisse salade.<br />    Daghap is exclusief bijpassende wijn.</p> <p>&nbsp;</p> <p><strong>Wij verwelkomen u graag!</strong></p> <p><em><strong>Team Bistro Puur</strong></em></p> <p class="rteindent1 rtecenter"><strong>&nbsp;</strong></p> an Bistro Puur';
$html = str_get_html($html); // create a html DOM object again
foreach($html->find('strong') as $e){ // search for <strong> tag
$temp[] = [$e->innertext]; // get the inside of the html tag
}
print_r($temp);

Array
(
    [0] => <pre> </pre><p><strong>De heerlijke Pure Daghappen v</strong><strong>an Bistro Puur</strong></p> <p><strong>Voor de vaste lage prijs van&nbsp;slechts &euro; 8,50 !</strong></p> <p>geserveerd tussen 17:00 uur &amp; 18:30 uur</p> <p>&nbsp;</p> <h2>   <strong>De heerlijke Pure Daghappen voor week 32 zijn:</strong></h2> <p><strong><u>Dinsdag 22 Augustus:</u></strong></p> <p><strong>Gegrilde vakenshaas medaillons met champignonsaus</strong></p> <p>  <strong><u>Woensdag 23 Augustus:</u></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p> <p><strong>​Gekonfijte scharrelhoen bout met truffelsaus</strong></p> <p>   <strong><u>Donderdag 24 Augustus:&nbsp;</u></strong>&nbsp;&nbsp;</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;<br />  <strong>Gebakken zalmfilet met witte wijnsaus</strong></p> <p>  <strong><u>Vrijdag 25 Augustus;</u></strong></p> <p><strong>​In de oven gebakken kabeljauw filet met pesto saus</strong></p> <p>&nbsp;</p> <p>Alle heerlijke Pure Daghappen worden vergezeld door een aardappelgarnituur en een frisse salade.<br />    Daghap is exclusief bijpassende wijn.</p> <p>&nbsp;</p> <p><strong>Wij verwelkomen u graag!</strong></p> <p><em><strong>Team Bistro Puur</strong></em></p> <p class="rteindent1 rtecenter"><strong>&nbsp;</strong></p> 
    [1] => Array
        (
            [0] => De heerlijke Pure Daghappen v
        )

    [2] => Array
        (
            [0] => an Bistro Puur
        )

    [3] => Array
        (
            [0] => Voor de vaste lage prijs van&nbsp;slechts &euro; 8,50 !
        )

    [4] => Array
        (
            [0] => De heerlijke Pure Daghappen voor week 32 zijn:
        )

    [5] => Array
        (
            [0] => <u>Dinsdag 22 Augustus:</u>
        )

    [6] => Array
        (
            [0] => Gegrilde vakenshaas medaillons met champignonsaus
        )

    [7] => Array
        (
            [0] => <u>Woensdag 23 Augustus:</u>
        )

    [8] => Array
        (
            [0] => ​Gekonfijte scharrelhoen bout met truffelsaus
        )

    [9] => Array
        (
            [0] => <u>Donderdag 24 Augustus:&nbsp;</u>
        )

    [10] => Array
        (
            [0] => Gebakken zalmfilet met witte wijnsaus
        )

    [11] => Array
        (
            [0] => <u>Vrijdag 25 Augustus;</u>
        )

    [12] => Array
        (
            [0] => ​In de oven gebakken kabeljauw filet met pesto saus
        )

    [13] => Array
        (
            [0] => Wij verwelkomen u graag!
        )

    [14] => Array
        (
            [0] => Team Bistro Puur
        )

    [15] => Array
        (
            [0] => &nbsp;
        )

)

Questions: 问题:

  • Why am I getting the whole html string again at array[0] ? 为什么我要在array[0]处再次获取整个html字符串?
  • How can I quickly remove the remaining , <u>..</ul> tags? 如何快速删除其余的<u>..</ul>标签?
  • I am obtaining 15 nested arrays. 我正在获取15个嵌套数组。 I can work with those but is it possible to remove the nesting from the start? 我可以使用它们,但是是否可以从一开始就删除嵌套?
  • Can I do all this in a more efficient way? 我可以以更有效的方式来完成所有这些工作吗?

I updated to code to (based on the feedback from Peter): 我更新了代码(基于Peter的反馈):

$html = str_get_html($str);
foreach($html->find('strong') as $e){
    $temp[] = $e->plaintext;
}

This gives me the correct plain array with all the data. 这为我提供了所有数据的正确普通数组。 Great! 大!

Why am I getting the whole html string again at array[0]? 为什么我要在array [0]处再次获取整个html字符串?

Probably because you still have the following line in your code, initializing the $temp -variable with an array with a single element $e->innertext . 可能是因为您的代码中仍然包含以下行,所以使用带有单个元素$e->innertext的数组初始化$temp $e->innertext

$temp = [$e->innertext];

Initialize the $temp variable just before your foreach with $temp = []; $temp = [];之前,在foreach之前初始化$temp变量$temp = []; .

How can I quickly remove the remaining ,.. tags? 如何快速删除其余的..标签?

Use $e->plaintext instead of $e->innertext (make sure to read the documentation ) 使用$e->plaintext代替$e->innertext (请务必阅读文档

I am obtaining 15 nested arrays. 我正在获取15个嵌套数组。 I can work with those but is it possible to remove the nesting from the start? 我可以使用它们,但是是否可以从一开始就删除嵌套?

Because you tell it to create an array everytime (why are you doing that??): 因为您告诉它每次都创建一个数组(为什么这样做?):

$temp[] = [ $e->innertext ];
          ^ array open    ^ array-close

Use $temp[] = $e->innertext; 使用$temp[] = $e->innertext; instead (or plaintext according to previous) 相反(或根据先前的plaintext

Don't know how you are including html DOM, but using this script: 不知道您如何包含html DOM,但是使用以下脚本:

<?php
include "simple_html_dom.php";
$html = '</pre><pre> </pre><p><strong>De heerlijke Pure Daghappen v</strong><strong>an Bistro Puur<$
$html = str_get_html($html); // create a html DOM object again
foreach($html->find('strong') as $e){ // search for <strong> tag
$temp[] = $e->plaintext; // get the inside of the html tag
}
var_dump_pre($temp);


function var_dump_pre($mixed = null) {
  echo '<pre>';
  print_r($mixed);
  echo '</pre>';
  return null;
}
?>

...will produce this output: ...将产生以下输出:

Array
(
    [0] => De heerlijke Pure Daghappen v
    [1] => an Bistro Puur
    [2] => Voor de vaste lage prijs van slechts € 8,50 !
    [3] => De heerlijke Pure Daghappen voor week 32 zijn:
    [4] => Dinsdag 22 Augustus:
    [5] => Gegrilde vakenshaas medaillons met champignonsaus
    [6] => Woensdag 23 Augustus:
    [7] => ​Gekonfijte scharrelhoen bout met truffelsaus
    [8] => Donderdag 24 Augustus: 
    [9] => Gebakken zalmfilet met witte wijnsaus
    [10] => Vrijdag 25 Augustus;
    [11] => ​In de oven gebakken kabeljauw filet met pesto saus
    [12] => Wij verwelkomen u graag!
    [13] => Team Bistro Puur
    [14] =>  
)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM