【问题标题】:I need to grab data from html of a remote url我需要从远程 url 的 html 中获取数据
【发布时间】:2012-12-29 07:29:36
【问题描述】:

我需要一个接受这个 ul 的脚本:

<ul id="activitylist">
    <li class="activitybit forum_thread">
        <div class="avatar"> <img alt="secret team's Avatar" src="images/misc/unknown.gif" title="secret team's Avatar"> </div>
        <div class="content hasavatar">
        <div class="datetime"> <span class="date">Today,&nbsp;<span class="time">11:25pm</span></span> </div>
        <div class="title"> <a class="username" href="member.php/436070-secret-team">secret team</a> started a thread <a href="showthread.php/415403-Allow-VIDEO-Code-missing-in-settings">'Allow [VIDEO] Code' missing in settings</a> </div>
        <div class="views">0 replies | 0 view(s)</div>
    </li>
</ul>

一个ul中有10到15个子li。我需要线程有 0 个回复的每个子 li 的线程名称。我在上面发布了一个示例 li。所以对于那个例子,我需要这个文本:

'Allow [VIDEO] Code' missing in settings

这个 div 有 0 个回复作为文本:

 <div class="views">0 replies | 0 view(s)</div>

我有这个示例代码,但它不能正常工作。

<?php
$request_url = 'https://www.vbulletin.com/forum/activity.php';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $request_url); // The url to get links from
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // We want to get the respone
$result = curl_exec($ch);

$sPattern = "/<li class=\"activitybit forum_thread\">(.*?)<\/li>/s";
preg_match_all($sPattern, $result, $parts);
$links = $parts[1];
foreach ($links as $link) {
    if (stripos($link, "0 replies") !== false) {
        echo $link . "<br>";
    }
}
curl_close($ch);
?>

【问题讨论】:

    标签: php html regex html-parsing web-scraping


    【解决方案1】:

    这是一个可以解析任何种HTML的正则表达式:

    $regex = new DOMDocument;
    $regex->loadHTML($html);
    

    现在很严重。 DOMDocument 已解析您的所有 HTML。您现在可以使用thesethese 函数遍历标签并提取它们的属性和内容。但是使用名为DOMXPath 的伴生类要容易得多:

    $xpath = new DOMXpath($regex);
    foreach ($xpath->query("//ul[@id='activitylist']/li") as $li) {
        $view = $xpath->query(".//div[@class='views']", $li)->item(0);
        $link = $xpath->query(".//div[@class='title']/a", $li)->item(1);
        if (preg_match("/0 replies/", $view->nodeValue)) {
            echo $link->nodeValue . " (" . $link->getAttribute("href") . ")\n";
        }
    }
    

    这将输出一些关于您的 HTML 不完美的警告以及以下内容:

    'Allow [VIDEO] Code' missing in settings (showthread.php/415403-Allow-VIDEO-Code-missing-in-settings)
    

    您可以阅读有关使用 Regex PHP 解析 HTML here 的更多信息。 XPath 示例的完整列表是available here

    【讨论】:

    • 有点帮助,但删除讽刺并添加一个真实的解释为什么这有助于解决问题
    • 谢谢salman.$regex->loadHTML($html);这里我如何从远程url获取$html变量中的html内容。我可以使用curl还是我需要使用file_get_contents。 ?请帮帮我,我今天需要完成这个。谢谢。
    • 如果你仔细看文档你会注意到这个方法DOMDocument::loadHTMLFile。它应该接受http://url。您也可以使用file_get_contents("http://url")。如果两种方法都失败,请使用 cURL。
    • 萨尔曼你是个天才。你解决了我的问题。我给你 100 分。你能给我你的电子邮件吗。我想和你联系。承诺我只会在我真的需要你的帮助时联系你。再次感谢萨尔曼。
    • 萨尔曼我会在这里添加评论,如果我会坚持任何一点,请继续重新检查这篇文章。上帝保佑你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 2015-01-03
    • 2012-10-14
    • 2014-06-12
    • 1970-01-01
    相关资源
    最近更新 更多