1

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

可以在此处找到参考:http ://simplehtmldom.sourceforge.net/manual.htm 上的“如何查找 HTML 元素”


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

定义后代选择器div[...] li a很容易。但要将其缩小到我尝试的主页:

  1. 第 6 个li元素...通过索引(见下文,导致错误“试图获取非对象的属性”)
  2. 奇怪label=Internet:的代码

不幸的是,我没有成功:)

期望的输出

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>
4

1 回答 1

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";
}

使用foreachon时,$html->find您不能使用索引,或者它假定它是单个项目。

所以首先我们foreachdivs,然后是单曲li(应该在第 6 位,但它似乎从 0 开始计数,所以它在第 5 位)从那里我们找到链接并检查它是否存在,如果没有,null如果null没有anchor找到我们打印它。

输出是:

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

如果您愿意,您可以将其恢复为:

$link = $div->find('ul li', 5)->find('a', -1);
于 2013-07-05T14:11:44.913 回答