正则表达式从网站上提取数据

时间:2013-05-03 20:11:59

标签: php regex

我在找工作。我正在制作一个每天都会有一次cron的脚本。它正在从网站上提取文字和链接。在正则表达式模式方面,我很无奈。

以下是我要提取的数据的示例:

<div class="cat-list-item job-list-item">

<h3 class="expressway full-width"><a href="/about/careers/network_engineer_voip_telephony">Network Engineer - VoIP Telephony</a></h3>

<div class="career-summary">

    <p>
        Provide daily support, proactive maintenance and independent troubleshooting, and identify capacity/performance issues to ensure
    </p>

</div>

<p class="locations-heading"><b>Locations</b></p>

<ul class="locations-list normal">


    <li>
        Elizabethtown Headquarters
    </li>

</ul>

<div class="list-bottom">
    <a class="learn-more replace" href="/about/careers/network_engineer_voip_telephony">Learn More</a>
</div>

这是我到目前为止所做的:

<?php
$url = "http://bluegrasscellular.com/about/careers/";
$input = @file_get_contents($url) or die("Could not access file: $url");
$regexp = "<h3 class=\"expressway full-width\"><a\s[^>]*href=\"\/about\/careers\/(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>";
if (preg_match_all("/$regexp/siU", $input, $matches, PREG_SET_ORDER)) {
    foreach ($matches as $match) {
        // $match[2] = link address
        // $match[3] = link text
        echo "<a href='http://bluegrasscellular.com/about/careers/{$match[2]}'>{$match[3]}</a><br>";
    }
}
?>

所有这一切都是拉动文本和href关闭。我也想抓住以下内容:

  • 提供日常支持,主动维护和独立故障排除,并确定容量/性能问题以确保
  • 伊丽莎白镇总部

我最终希望将这些存储在数据库中并通知我任何新职位。我不知道如何解决这个问题。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

使用Dom文档类。从以下开始:

$doc = new DOMDocument();
//load HTML string into document object
if ( ! @$doc->loadHTML($html)){
    return FALSE;
}
//create XPath object using the document object as the parameter
$xpath = new DOMXPath($doc);

然后,您需要为要提取的每个元素编写查询。要获取“职业路径”div中的文本,您可以使用以下xpath查询:

$query = "//div[@class='career-summary']";
//XPath queries return a NodeList
$res = $xpath->query($query);
$text = trim($res->item(0)->nodeValue);

我没有测试过,但这是一般的想法。以下查询应从指定的列表元素中获取文本:

$query = "//ul[@class='locations-list normal']";

为了做这种事情,了解xpath查询是值得的。在使用HTML或XML时,它们比正则表达式要好得多。

修改

要访问多个项目,您可能需要更改查询。例如,如果有多个列表项,则可以按如下方式更改查询:

$query = "//ul[@class='locations-list normal']/li";

“/ li”表示您希望“ul”标记中的列表项具有指定的类。获得结果后,可以使用foreach循环遍历它们:

$out = array;
foreach ($res as $node){
    $out[] = $node->nodeValue;
}