【问题标题】:php simple DOM parserphp 简单的 DOM 解析器
【发布时间】:2014-04-29 17:43:46
【问题描述】:

好的,所以我已经为此奋斗了一段时间,所以也许有人可以帮助我。

我正在尝试从此 HTML 获取电子邮件链接:

<div id="field_11" class="fieldRow span12 lastFieldRow">
  <span class="caption">E-mail</span>
  <span class="output">
   <script type="text/javascript">
    <!--
     document.write('<a hr'+'ef="mai'+'lto'+':'+
      '%40;%67;%6d;%61;%69;%6c;<\/a>');
    //-->
   </script>
   <a href="mailto:%40%67%6d%61%69%6c">@mail</a>
  </span>
</div>

我试图在 a href="mailto:..." 部分之后获取 html 代码的“@mail”部分。不是 document.write() 部分,而是代码中的最后一个标签。

出于某种原因,当我尝试使用输出类获取标签跨度的子级时,它认为它只有 1 个子级,即脚本标签,但我似乎无法获取电子邮件纯文本。

到目前为止我有什么:

 $target_url = "some_web_site";
 $html = new simple_html_dom();
 $html->load_file($target_url);

foreach($html->find('span[class=output]') as $d){ 
    echo $d->children(1)->plaintext . "<br />";
 }

有什么帮助吗?

【问题讨论】:

  • 您的代码应该可以工作,它的输出是什么(或错误消息)?
  • 它会打印出一堆这样的错误:注意:尝试在第 224 行的 /Applications/MAMP/htdocs/webcrawler/index.php 中获取非对象的属性
  • 听起来您的 load_file() 加载不正确。您可以尝试删除第 2 行和第 3 行(均以 $html 开头,并替换为 $html = file_get_html($target_url);
  • @LaughDonor - 尝试了你的方法,仍然有这些错误。
  • 嗯,您遇到此问题的主要原因是 $html-&gt;find('span[class=output]') 正在返回 null。您需要检查以确保您的选择器是正确的。也许改用span.output

标签: php html dom simpledom


【解决方案1】:

只用 DOM+Xpath 也可以。

$dom = new DOMDocument();
$dom->loadHtml($html);
//$dom->loadHtmlFile($htmlFile);
$xpath = new DOMXpath($dom);

var_dump(
  $xpath->evaluate(
    'string(//span[@class="output"]//a[starts-with(@href, "mailto:")])'
  )
);

输出:https://eval.in/148063

string(5) "@mail"

Xpath 选择所有具有class 属性“输出”的span 元素

//span[@class="output"]

然后它会查找a 属性以“mailto:”开头的href 元素

//span[@class="output"]//a[starts-with(@href, "mailto:")]

其结果是a 元素节点的列表(示例内容为单个节点)。 string() 函数将第一个节点转换为字符串,如果节点列表为空,它将返回一个空字符串。

string(//span[@class="output"]//a[starts-with(@href, "mailto:")])

【讨论】:

    猜你喜欢
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 2015-02-14
    • 2014-01-15
    • 1970-01-01
    相关资源
    最近更新 更多