使用索引或Innertext解析HTML

时间:2013-07-05 10:29:33

标签: php html-parsing simple-html-dom

租约请注意我的问题专门针对“简单HTML DOM库”! 有3k +代码行,我没兴趣使用不同的解析器。

参考资料可以在这里找到: “如何在http://simplehtmldom.sourceforge.net/manual.htm

找到HTML元素”

使用以下代码,我尝试从各种div元素中提取主页网址。

定义后代选择器div[...] li a很简单。但是为了缩小到主页,我尝试了:

  1. 第6个li元素...通过索引(见下文,导致错误“试图获取非对象的属性”)
  2. 奇怪的label=Internet:进入代码
  3. 不幸的是我没有成功:)

    所需输出

    http://www.someurl.com/
    http://www.anotherurl.com/
    

    不起作用的代码

    foreach($html->find('div[class=contact-data] li a', 6) as $element_details) {
    // variable $html contains the Input listed below 
    
        // Output $element_details
    
        }
    

    输入(存储在变量$ html中)

    <div class="contact-data">
        <ul class="plain-list">
        <li>
            Somestreet 18</li>
        <li>
            88888
            Somecity</li>
        <li>
            <label>
            Tel:</label>123/123456</li>
        <li>
            <label>
            Fax:</label>123/123457</li>
    
        <li>
            <label>
            E-Mail:</label><a href="http://www.somesite.com/de/Service/ContactParam?mail_pnr=000290080" onclick="">Contact</a></li>
        <li>
            <label>
            Internet:</label><a href="http://www.someurl.com/">Homepage</a></li>
        <li>    
            <div style="margin-left: 0px">
            </div></li>
        </ul>
    </div>
    
    <div class="contact-data">
        <ul class="plain-list">
        <li>
            Anotherstreet 68</li>
        <li>
            88888
            Anothercity</li>
        <li>
            <label>
            Tel:</label>123/123447</li>
        <li>
            <label>
            Fax:</label>123/123458</li>
    
        <li>
            <label>
            E-Mail:</label><a href="http://www.anothersite.com/de/Service/ContactParam?mail_pnr=000570030" onclick="">Contact</a></li>
        <li>
            <label>
            Internet:</label><a href="http://www.anotherurl.com/">Homepage</a></li>
        <li>    
            <div style="margin-left: 0px">
            </div></li>
        </ul>
    </div>
    

1 个答案:

答案 0 :(得分:2)

经过测试和运作的代码

<?php
include "simplehtmldom/simple_html_dom.php";

$str = <<<HTML
<div class="contact-data">
    <ul class="plain-list">
    <li>
        Somestreet 18</li>
    <li>
        88888
        Somecity</li>
    <li>
        <label>
        Tel:</label>123/123456</li>
    <li>
        <label>
        Fax:</label>123/123457</li>

    <li>
        <label>
        E-Mail:</label><a href="http://www.somesite.com/de/Service/ContactParam?mail_pnr=000290080" onclick="">Contact</a></li>
    <li>
        <label>
        Internet:</label><a href="http://www.someurl.com/">Homepage</a></li>
    <li>
        <div style="margin-left: 0px">
        </div></li>
    </ul>
</div>

<div class="contact-data">
    <ul class="plain-list">
    <li>
        Anotherstreet 68</li>
    <li>
        88888
        Anothercity</li>
    <li>
        <label>
        Tel:</label>123/123447</li>
    <li>
        <label>
        Fax:</label>123/123458</li>

    <li>
        <label>
        E-Mail:</label><a href="http://www.anothersite.com/de/Service/ContactParam?mail_pnr=000570030" onclick="">Contact</a></li>
    <li>
        <label>
        Internet:</label><a href="http://www.anotherurl.com/">Homepage</a></li>
    <li>
        <div style="margin-left: 0px">
        </div></li>
    </ul>
</div>
HTML;

$html= str_get_html($str);

// Find the divs
foreach($html->find('div[class="contact-data"]') as $div)
{
    // Find the listing at the 6th, 
    // however simplehtmldom counts from 0
    $li = $div->find('ul li', 5);
    // Find the link
    $link = $li->find('a', -1);

    // Test if element exist and print if yes
    if(!is_null($link))
        echo $link->href . "\n";
}

foreach上使用$html->find时,您无法使用索引,也无法使用单个项目。

首先我们foreach div s,然后是单li(应该是第6个,但它似乎从0开始计数,所以它从5开始)来自如果我们打印出null没有null,我们会找到该链接并检查是否为anchor

输出是:

http://www.someurl.com/
http://www.anotherurl.com/

如果你想要你可以恢复它:

$link = $div->find('ul li', 5)->find('a', -1);