废料搜索结果后无法仅打印搜索结果

时间:2019-05-19 05:55:28

标签: php web-scraping domparser

我正在使用Simple Html Dom。我是网络爬虫的新手,正在从booking.com刮爬数据,我仅打印搜索结果网址时遇到问题。我的代码如下

<?php

    include 'simple_html_dom.php';

    $searchText = "Venice";
    $searchText = str_replace(" ", "+", $searchText);

    $url = "https://www.booking.com/searchresults.en-gb.html?aid=1781605&lang=en-gb&sid=3bb432f656e368125330f71ea0e74e36&sb=1&src=index&src_elem=sb&error_url=https://www.booking.com/index.en-gb.html?aid=1781605;sid=3bb432f656e368125330f71ea0e74e36;sb_price_type=total;srpvid=dc2798d544dd007f&;&ss=".$searchText."&is_ski_area=0&ssne=".$searchText."&ssne_untouched=".$searchText."&dest_id=-132007&dest_type=city&checkin_year=2019&checkin_month=5&checkin_monthday=19&checkout_year=2019&checkout_month=5&checkout_monthday=20&group_adults=2&group_children=0&no_rooms=1&b_h4u_keep_filters=&from_sf=1";


    print $url."<br>";


    $html = file_get_html($url);

    $i = 0;

    $linkObjs = $html->find('a');

    foreach ($linkObjs as $linkObj) {

        $link  = trim($linkObj->href);

        /*if (!preg_match('/^https?/', $link) && preg_match('/^hotel/', $link, $matches) && preg_match('/^https?/', $matches[1])) {
            $link = matches[1];
        } else if (!preg_match('/^https?/', $link)) {
            continue;
        }*/

        if (!preg_match('/^https?/', $link)) {
            continue;
        }

        $i++;

        echo "Link: ". $link . "<br/><hr/>";

    }
?>

现在问题是我想打印URL中具有/hotel/之类的https://www.booking.com/hotel/it/nh-collection-venezia-palazzo-barocci.en-gb.html路径的搜索结果链接,现在我不知道如何设置preg_replace以便仅打印搜索结果网址也是标题。

1 个答案:

答案 0 :(得分:1)

在表达式中使用^意味着声明要在第二个子句中测试的字符串的开头:

if (!preg_match('/^https?/', $link) && preg_match('/^hotel/', $link, $matches) && preg_match('/^https?/', $matches[1])) {

如果您想使用preg_match,则可以使用单个表达式来检查字符串是否以带有可选s的http开头:

^https?://.*?/hotel/
  • ^字符串的开头
  • https?://匹配http,可选的s://
  • .*?匹配除换行符非贪婪以外的所有字符
  • /hotel/字面上匹配

Regex demo | Php demo

例如:

if (!preg_match('~^https?://.*?/hotel~', $link)) {
    continue;
}

如果不使用正则表达式,也可以结合使用substrstrpos

if (!(substr($link, 0, 4 ) === "http" && strpos($link, '/hotel/') !== false)) {
    continue;
}

Php demo