Php解析html dom和目标元素

时间:2016-05-27 05:29:10

标签: php html parsing web screen-scraping

我有一个游戏服务器,我想建立一个简单的PHP来获取我的服务器播放器因为没有API可供使用

所以经过一点点搜索后我发现了Simple php DOM Parser这非常适合我想做的事情:)

假设我的服务器链接包含此结构

<div id="server-page-info">

<div class="row-tight">
    <div class="box span1">
        <header>
            <h1>Players</h1>
        </header>
    </div>
    <div class="box span1">
        <header>
            <h1>Ping</h1>
        </header>
    </div>
</div>
<div class="row-tight">
    <div class="box span1">
        <section class="box-content">
            <h5>
                0 / 64
            </h5>
        </section>
    </div>
    <div class="box span1">
        <section class="box-content">
            <h5>
                -ms
            </h5>
        </section>
    </div>
</div>

</div>

幸运的是,有一堆行紧盒内容类名:)

所以我想获得其中一个 box-content 部分的值,这些部分显示 0/64 以上

我的PHP代码

对不起我是PHP的新手。你也可以看到我如何定位元素,但它不起作用,我没有得到任何东西:)

require 'simple_html_dom.php';
$url = '';
$html = file_get_html($url);

$player = $html->find('div[id=server-page-info] .row-tight:nth-child(2) .box:first-child');

foreach( $player as $players ){

    echo $players->plaintext;

    }

我还要再添一个问题:) 现在,当我将服务器播放器的值作为明文我希望将其包装在div :)时

谢谢

1 个答案:

答案 0 :(得分:1)

This page我看不到它支持nth-child,但它支持其他语法:$html->find('<element>', <nth-child>)。所以你的代码应该是这样的:

$player = $html->find('div[id=server-page-info]')->find('.row-tight',1)->find('.box',0);

我建议使用#代替属性:

$player = $html->find('#server-page-info')->find('.row-tight',1)->find('.box',0);

<强>更新

如果您想要执行下一个find,则需要始终只选择一个find('<element>', <nth-child>)的元素:$player = $html->find('#server-page-info',0)->find('.row-tight',1)->find('.box',0);

我在下面测试过它,显示0/64。

require 'simple_html_dom.php';
$html = str_get_html('<div id="server-page-info">
<div class="row-tight">
    <div class="box span1">
        <header>
            <h1>Players</h1>
        </header>
    </div>
    <div class="box span1">
        <header>
            <h1>Ping</h1>
        </header>
    </div>
</div>
<div class="row-tight">
    <div class="box span1">
        <section class="box-content">
            <h5>
                0 / 64
            </h5>
        </section>
    </div>
    <div class="box span1">
        <section class="box-content">
            <h5>
                -ms
            </h5>
        </section>
    </div>
</div>
</div>');
$player = $html->find('#server-page-info',0)->find('.row-tight',1)->find('.box',0);
echo $player->plaintext;