【问题标题】:web scraping content within <div> tag and <td> tag<div> 标签和 <td> 标签内的网页抓取内容
【发布时间】:2016-01-31 16:44:57
【问题描述】:

我需要从 http://www.hegnar.no/netfonds/aksjekurser/ 这个链接中抓取数据。实际上我想从这个链接的表中抓取数据。但是表格的代码是写在 div 标签内的。我使用了 php regex 和 file_get_content 我无法抓取它,你能帮我写脚本吗?

<?php

$html = file_get_contents("http://www.hegnar.no/netfonds/aksjekurser");


preg_match_all(
            '<tr>
<td class="left"><a href=".*?">(.*?)<\/a><\/td>.*?
<td class="left">(.*?)<\/td>.*?
<td name=".*?">(.*?)<\/td>.*?
<td name=".*?">(.*?)<\/td>.*?
<td>(.*?)<\/td>.*?
<td class="up" name=".*?">(.*?)<\/td>.*?
<td class="up" name=".*?">(.*?)<\/td>.*?
<td>(.*?)<\/td>.*?
<td>(>*?)<\/td>.*?
<td>(.*?)<\/td>.*?
<td>(.*?)<\/td>.*?
<td name=".*?">(.*?)<\/td>
<td name=".*?">(.*?)<\/td><\/tr>/s',


$html,
$posts, // will contain the article data
PREG_SET_ORDER // formats data into an array of posts
);

foreach ($posts as $post) {
$selskap = $post[1];
$ticket = $post[2];
$siste = $post[3];
$kejop = $post[4];
$slag = $post[5];
$ending = $post[6];
$ending2 = $post[7];
$apring = $post[8];
$lav = $post[9];
$hoy = $post[10];
$forrige = $post[11];
$volume = $post[12];
$ratio = $post[13];



echo "$selskap</br>";
echo "$ticket</br>";
echo "$siste</br>";
echo "$kejop</br>";
echo "$slag</br>";
echo "$ending</br>";
echo "$ending2</br>";
echo "$apring</br>";
echo "$lav</br>";
echo "$hoy</br>";
echo "$forrige</br>";
echo "$volume</br>";
echo "$ratio</br>";


}

echo "<p>" . count($posts) . " posts found</p>";

【问题讨论】:

  • 请通过在此处复制部分数据(而不是使用外部链接)来显示您尝试“抓取”的数据示例。请出示您提到的 PHP 代码。
  • 在此链接的左侧菜单中,选择“kursliste”。它将显示目录。我想抓取整个数据表。 eg:第一列是“selskap”,这里需要刮掉所有的名字。同样整列表格
  • ABG Sundal Collier... 这是示例代码需要被刮掉,数据是“ABG Sundal Collier”。但是这个标签在 div 标签内
  • 请使用正则表达式和file_get_content() 调用显示您的PHP 代码。
  • 我在上面提交了我的代码

标签: web screen-scraping


【解决方案1】:

你可以使用这个库 PHP Simple HTML DOM Parser

也可以参考这个问题:Extract Information from HTML

【讨论】:

    【解决方案2】:

    您的正则表达式中至少有 1 个错字:

    <td>(>*?)<\/td>.*?
    

    大概应该写成:

    <td>(.*?)<\/td>.*?
    

    【讨论】:

    • 即使错误消息是这样的警告:file_get_contents(): php_network_getaddresses: getaddrinfo failed: 这通常是主机名解析期间的临时错误,意味着本地服务器没有收到来自权威服务器的响应.在 C:\Program Files (x86)\EasyPHP-DevServer-14.1VC9\data\localweb\projects\script.php 第 3 行
    • Warning: file_get_contents(hegnar.no/netfonds/aksjekurser): failed to open stream: php_network_getaddresses: getaddrinfo failed: 这通常是主机名解析期间的临时错误,意味着本地服务器没有收到来自权威机构的响应服务器。在 C:\Program Files (x86)\EasyPHP-DevServer-14.1VC9\data\localweb\projects\script.php 第 3 行
    • 警告:preg_match_all(): Unknown modifier '' in C:\Program Files (x86)\EasyPHP-DevServer-14.1VC9\data\localweb\projects\script.php 第 27 行警告:无效为第 29 行 C:\Program Files (x86)\EasyPHP-DevServer-14.1VC9\data\localweb\projects\script.php 中的 foreach() 提供的参数 找到 0 个帖子
    • 在尝试解析之前添加print($html)。另外,我会使用 cURL 和伪造的浏览器标题和 cookie,而不是 file_get_contents()
    猜你喜欢
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 2012-10-30
    相关资源
    最近更新 更多