【问题标题】:Parsing HTML with Indices or Innertext使用索引或内部文本解析 HTML
【发布时间】:2013-07-03 10:16:54
【问题描述】:

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

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


使用以下代码,我尝试从各种 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>

【问题讨论】:

  • 如果您需要它专门用于简单的 XML,请使用标签和正文而不是标题来显示。
  • 好的,我把它放在修改后的问题中。我的坏
  • 我已经更新了一个我认为对您有帮助的示例,我没有使用该库的经验,但它似乎应该可以工作。

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


【解决方案1】:

经过测试和工作的代码

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

$html-&gt;find 上使用foreach 时,您不能使用索引,否则它会假定它是单个项目。

所以首先我们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);

【讨论】:

  • 感谢 Prix,我不得不稍微澄清一下我的问题:这是我拥有的一个更大项目的一部分,专门针对“简单的 PHP HTML Dom 解析器”。不得不部分回滚您的修订。 Xpath 看起来很时尚,也许有一天我会重写所有东西 :)
  • 啊,太糟糕了,你的建议听起来太好了!我临时在我的问题中发布了结果。我认为我们必须关闭这个代码的丑陋:)
  • @somethis 我们也错过了搜索中的ul
  • 好的,已发布。它运行了几个小时......发布了前几行。 ul 似乎没有太大区别,不过会更新我的代码。
  • @somethis 你能独立运行我的代码,而不是在你的应用程序上实现只是为了看看它是否做了它应该做的事情吗?
猜你喜欢
  • 2016-05-28
  • 2014-07-26
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-26
  • 2021-05-08
  • 2017-04-20
相关资源
最近更新 更多