Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试使用php和DOM刮取链接_Php_Dom_Xpath_Screen Scraping - Fatal编程技术网

尝试使用php和DOM刮取链接

尝试使用php和DOM刮取链接,php,dom,xpath,screen-scraping,Php,Dom,Xpath,Screen Scraping,如果我有下面的X(HTML)结构,那么如何在div树的深处捕获imgur链接 我尝试了几种不同的方法。我真正想要的是为包含“siteTable”的div创建一个节点树,因为该div中有许多div包含更多imgur链接。如果您没有注意到,这是reddit的html 谢谢 <html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml"> <head> <body class="listing-page

如果我有下面的X(HTML)结构,那么如何在div树的深处捕获imgur链接

我尝试了几种不同的方法。我真正想要的是为包含“siteTable”的div创建一个节点树,因为该div中有许多div包含更多imgur链接。如果您没有注意到,这是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">

我总是试图使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;
}
$link_nodes = $xpath->query('//a[@class="thumbnail"][contains(@href, "imgur.com")]');
此外,您可能希望通过增强XPath查询来确保获得imgur链接:

$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;
}
$link_nodes = $xpath->query('//a[@class="thumbnail"][contains(@href, "imgur.com")]');

我总是试图使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;
}
$link_nodes = $xpath->query('//a[@class="thumbnail"][contains(@href, "imgur.com")]');
此外,您可能希望通过增强XPath查询来确保获得imgur链接:

$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;
}
$link_nodes = $xpath->query('//a[@class="thumbnail"][contains(@href, "imgur.com")]');
您可以借助解析器。下载并将其包含在脚本中。然后使用下面的代码解析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]');
如何解析:

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]');
您还将在该网站上获得完整的教程。

您可以借助解析器。下载并将其包含在脚本中。然后使用下面的代码解析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]');
如何解析:

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

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

对不起,我做了一次编辑。那是一个打字错误。从技术上讲,您可以在XPath查询中使用
//img
,因为
是一个HTML元素。但是,您应该使用
//a
,因为我们正在查找链接。这不会返回任何内容,我很困惑,因为您没有使用任何子查询,您似乎正在创建一个直接指向我想要的行的查询,我不知道这是可能的。这很好,但如果没有class属性中的额外空间,它将失败。另外,请尝试:
$link\u node->getAttribute('href')
这只是没有返回任何内容,我已经包含了额外的空间$链接u节点正在返回empty@thetao,XPath非常灵活,允许您直接访问节点,而无需遍历整个DOM结构。为了将来的参考,你会发现一些有用的例子和一个简单的表单来测试你的XPath表达式。从技术上讲,您可以在XPath查询中使用
//img
,因为
是一个HTML元素。但是,您应该使用
//a
,因为我们正在查找链接。这不会返回任何内容,我很困惑,因为您没有使用任何子查询,您似乎正在创建一个直接指向我想要的行的查询,我不知道这是可能的。这很好,但如果没有class属性中的额外空间,它将失败。另外,请尝试:
$link\u node->getAttribute('href')
这只是没有返回任何内容,我已经包含了额外的空间$链接u节点正在返回empty@thetao,XPath非常灵活,允许您直接访问节点,而无需遍历整个DOM结构。为了将来的参考,你会发现一些有用的例子和一个简单的表单来测试你的XPath表达式。我宁愿使用DOM,我没有听说simple_html的好东西。domI宁愿使用DOM,我没有听说过简单的html domI的好东西,我看不出现有的Q&A材料如何不能回答这个问题。我看不出现有的Q&A材料如何不能回答这个问题。