3

我使用 php 网页抓取,我想从下面的 html 代码中获取周日的价格(3.65):

     <tr class="odd">
       <td >
           <b>Sunday</b> Info
           <div class="test">test</div>
       </td>
       <td>
       &euro; 3.65 *

       </td>
    </tr>

但我没有找到最好的正则表达式来做到这一点......我使用这个 php 代码:

    <?php
        $data = file_get_contents('http://www.test.com/');

        preg_match('/<tr class="odd"><td ><b>Sunday</b> Info<div class="test">test<\/div><\/td><td>&euro; (.*) *<\/td><\/tr>/i', $data, $matches);
        $result = $matches[1];
    ?>

但没有结果......正则表达式有什么问题?(我认为这是因为新的线条/空格?)

4

5 回答 5

6

不要使用正则表达式,HTML 不是正则的。

相反,请使用 DOM 树解析器,例如DOMDocument. 这documentation可能会对您有所帮助。

/s尽管我没有尝试过,但该开关应该可以帮助您使用原始的正则表达式。

于 2012-08-06T11:30:59.583 回答
3

问题是标签之间的空格。有换行符、制表符和/或空格。

您的正则表达式与它们不匹配。

您还需要为多行设置 preg_match!

我认为使用 xpath 进行抓取更容易。

于 2012-08-06T11:31:29.750 回答
2

尝试用 '' 替换换行符,然后再次执行正则表达式。

于 2012-08-06T11:33:36.757 回答
1

以这种方式尝试:

$uri = ('http://www.test.com/');
$get = file_get_contents($uri);

$pos1 = strpos($get, "<tr class=\"odd\"><td ><b>Sunday</b> Info<div class=\"test\">test</div></td><td>&euro;");
$pos2 = strpos($get, "*</td></tr>", $pos1);
$text = substr($get,$pos1,$pos2-$pos1);
$text1 = strip_tags($text);
于 2017-03-23T10:44:51.660 回答
0

使用 PHP DOMDocument 对象。我们将解析网页中的 HTML DOM 数据

    $dom = new DOMDocument();
    $dom->loadHTML($data);

    $trs = $dom->getElementsByTagName('tr'); // this gives us all the tr elements on the webpage

    // loop through all the tr tags
    foreach($trs as $tr) {
        // until we get one with the class 'odd' and has a b tag value of SUNDAY
        if ($tr->getAttribute('class') == 'odd' && $tr->getElementsByTagName('b')->item(0)->nodeValue == 'Sunday') {
            // now set the price to the node value of the second td tag
            $price = trim($tr->getElementsByTagName('td')->item(1)->nodeValue);
            break;
        }

    }

与其使用 DOMDocument 进行网页抓取,这有点乏味,您可以使用 SimpleHtmlDomParser,它是开源的。

于 2017-09-15T04:22:53.507 回答