试图使用php和DOM抓取链接

时间:2013-06-17 04:59:34

标签: php dom xpath screen-scraping

如果我有以下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);

2 个答案:

答案 0 :(得分:2)

我总是尝试将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")]');

答案 1 :(得分:0)

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

如何包含脚本:

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]');

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