【问题标题】:Trying to scrape links using php and DOM [duplicate]尝试使用 php 和 DOM 抓取链接 [重复]
【发布时间】:2013-06-13 00:04:51
【问题描述】:

如果我有以下 X(HTML) 结构,你将如何在 div 树的深处捕获该 imgur 链接?

我尝试了几种不同的方法。我真正想要的是为包含“siteTable”的 div 创建一个节点树,因为该 div 中有许多包含更多 imgur 链接的 div。如果你没有注意到,这是 reddit 的 html。

谢谢!

<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<body class="listing-page hot-page">
    <div id="header" role="banner">
    <div class="side">
    <a name="content"></a>
    <div class="content" role="main">
    <div class="infobar welcome">
    <div id="siteTable" class="sitetable linklisting">
        <div class=" thing id-t3_1gh823 over18 odd link " data-downs="5" data-ups="90" data-fullname="t3_1gh823" onclick="click_thing(this)">
            <p class="parent"></p>
            <span class="rank" style="width:2.20ex;">1</span>
            <div class="midcol unvoted" style="width:5ex;">
            <a class="thumbnail " href="http://i.imgur.com/FZ1I9wi.jpg">

这是我知道需要做的事情:

    $dom = new domDocument;


    @$dom->loadHTML(file_get_contents($link));


    $dom->preserveWhiteSpace = false;


    $xpath = new DOMXPath($dom);

    $href = $xpath->query('?????');

    print_r($tags);

【问题讨论】:

  • 我看不出现有的问答材料如何无法回答这个问题。

标签: php dom xpath screen-scraping


【解决方案1】:

我总是尝试使我的 XPath 尽可能基本,但尽可能具体。这使得在页面更改时更容易更改和调试。如果不查看整个页面或多个 reddit 页面,这很难说..但我假设 thumbnail 类仅用于您想要的缩略图链接。在这种情况下,我们可以进行一个非常简单(但具体)的 XPath 查询:

$link_nodes = $xpath->query('//a[@class="thumbnail"]');
if($link_nodes->length > 0) {
  // you can do a foreach loop here if there may be multiple links?
  $link_node = $link_nodes->item(0);
  $href = $link_node->attributes->getNamedItem('href')->value;
}

此外,您可能希望通过增强 XPath 查询来确保获得 imgur 链接:

$link_nodes = $xpath->query('//a[@class="thumbnail"][contains(@href, "imgur.com")]');

【讨论】:

  • 抱歉,我进行了编辑..这是一个错字。从技术上讲,您可以在 XPath 查询中使用 //img,因为 &lt;img&gt; 是一个 HTML 元素。但是,您应该使用//a,因为我们正在寻找链接。
  • 这不会返回任何东西,我很困惑,因为您没有使用任何子查询,您似乎正在创建一个直接进入我想要的行的查询,而我不知道这一点是可能的。
  • 这很好,但是如果类属性中没有多余的空格,它会失败。另外,请尝试:$link_node-&gt;getAttribute('href')
  • 这根本没有返回任何东西,我已经包含了额外的空间。 $link_nodes 返回空
  • @thetao,XPath 非常灵活,允许您直接访问节点,而无需遍历整个 DOM 结构。将来参考freeformatter.com/xpath-tester.html,您会发现一些有用的示例和一个简单的表单来测试您的 XPath 表达式。
【解决方案2】:

您可以借助 HTML DOM 解析器。下载并将其包含在您的脚本中。然后使用下面的代码解析 url。

如何包含脚本:

if (!function_exists('file_get_html')) {

require_once( 'public/frontend/simple_html_dom.php');

}

如何解析:

$scrape_url = 'http://www.example.com/a.php';

$html = file_get_html($scrape_url);

echo $html->find('div[siteTable]');

您还将在该网站上获得完整的教程。

【讨论】:

  • 我宁愿用DOM,没听说过simple_html_dom的好东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-17
  • 2021-09-02
  • 2017-09-09
  • 1970-01-01
相关资源
最近更新 更多