php - Können Sie mir bitte helfen, die regulären Regeln für das Crawlen der erforderlichen Daten einzusehen?
过去多啦不再A梦
过去多啦不再A梦 2017-05-16 13:16:30
0
2
639

A. html der zu crawlenden Seite:

$str2 = <<<EOT
<p topClassName='top1' topSwitch='on'  productId='2256' productName='⑧北京汉奥汽配有限公司' class='productPicListForm' id='module406product2256' faiWidth='160' faiHeight='101' faiWidthOr='600' faiHeightOr='382'>
    <table id='formTable2256_module406' class='formTable' cellpadding='0' cellspacing='0'>

        <tr>
            <td class='imgp'>
                <table cellpadding='0' cellspacing='0'>
                    <tr>
                        <td>
                            <a hidefocus='true' href='h-pd-2256-2_406.html' target='_blank'>
                                <img alt='⑧北京汉奥汽配有限公司' title='' src='http://5003100.s21i-5.faiusr.com/2/ABUIABACGAAggsfqwAUotY6_qgUw2AQ4-gI!160x160.jpg'  />
                            </a>
                        </td>
                    </tr>
                </table>
            </td>

            <td style='' class='propList'>
                <p style='' class='propp productName    '>
                    <a class='fk-productName' hidefocus='true' href='h-pd-2256-2_406.html' target='_blank' title='⑧北京汉奥汽配有限公司'>⑧北京汉奥汽配有限公司</a>
                </p>

                <p class='propp productProp6    '>
                    <span class='propName fk-prop-name'>主营:</span>
                    <span class='propValue fk-prop-other'  style='text-decoration:none;font-family:微软雅黑;font-weight:normal;'>大众 新速腾 新迈腾 新桑塔纳 新捷达 CC 新帕萨特 新宝来 收事故车及残值(郭京汉)</span>
                </p>

                <p class='propp productProp4    '>
                    <span class='propName fk-prop-name'>地址:</span>
                    <span class='propValue fk-prop-other'  style='text-decoration:none;font-family:微软雅黑;font-weight:normal;'>城环城B-01号</span>
                </p>
            </td>
        </tr>

    </table>
</p>
EOT;

B. Der Crawling-Regex, den ich geschrieben habe:

<?php 
// 去掉开头和结尾多余的无用字符
$str2     = trim($str2);
// 去掉换行符
$str2     = preg_replace('/\r\n|\n\r|\r|\n/' , '' , $str2);
// 抓取正则

$reg_list = "/<ps*topClassName='top1's*topSwitch='on's*productId='(d+)'s*productName='[x7f-xff]+'s*class='productPicListForm's*id='[A-z0-9]+'s*faiWidth='d+'s*faiHeight='d+'s*faiWidthOr='d+'s*faiHeightOr='d+'>s*<tables*id='w+'s*class='formTable's*cellpadding='d*'s*cellspacing='d+'>s*<tr>s*<tds*class='imgp'>s*<tables*cellpadding='d+'s*cellspacing='d+'>s*<tr>s*<td>s*<as*hidefocus='true's*href='[A-z0-9. -_]+'s*target='(_blank|_self)'>s*<imgs*alt='([x7f-xff]+)'s*title='[x7f-xffA-z0-9-]*'s*src='((http|https)://[A-z0-9./!-]+)'s*/>s*</a>s*</td>s*</tr>s*</table>s*</td>s*<tds*style='[A-z0-9:-_#]*'s*class='propList'>s*<tds*style='[A-z0-9:-_#]*'s*class='propList'>s*<p style='[A-z0-9:-_#]*' class='propps*productNames*'>s*<as*class='fk-productName's*hidefocus='true's*href='([A-z0-9-._]+)'s*target='(_blank|_self)'s*title='[x7f-xff]+'>[x7f-xff]+</a>s*</p>s*<ps*class='propps*productPropd*s*'>s*<spans*class='propNames*fk-prop-name'>主营:</span>s*<spans*class='propValues*fk-prop-other's*style='[A-z0-9x7f-xff: -_#;]*'>([x7f-xff ]+_-.)</span>s*</p>s*<ps*class='propps*productProp4s*'>s*<spans*class='propNames*fk-prop-name'>地址:</span>s*<spans*class='propValues*fk-prop-other's*style='[A-z0-9x7f-xff: -_#;]*'>([x7f-xff -_.]+)</span>s*</p>s*</td>s*</td>s*</tr>s*</table>s*</p>/";

Im Editor angezeigt (Screenshot):

Der Grund, warum es so kompliziert ist, liegt darin, dass ich einen Teil des Inhalts erhalten möchte:

Hier kommt der entscheidende Punkt. Es ist so kompliziert, dass es unmöglich ist, den regulären Ausdruck so zu debuggen, dass er den gewünschten Inhalt korrekt erfassen kann. Können Sie mir bitte sagen, wie Sie einen so komplexen regulären Ausdruck schreiben und ihn dann debuggen können, bis Sie die Daten erfassen können? Du willst von? ?

过去多啦不再A梦
过去多啦不再A梦

Antworte allen(2)
黄舟

又要祭出symfony/dom-crawler大法了。DOM大法好,退正则保平安

composer.json

{
    "require": {
        "symfony/css-selector": "^3.2",
        "symfony/dom-crawler": "^3.2"
    }
}

a.php

<?php
/**
 * Created by PhpStorm.
 * User: shellus
 * Date: 2017/4/11
 * Time: 11:55
 */

use Symfony\Component\DomCrawler\Crawler;

require 'vendor/autoload.php';

$str2 = <<<EOT
<p topClassName='top1' topSwitch='on'  productId='2256' productName='⑧北京汉奥汽配有限公司' class='productPicListForm' id='module406product2256' faiWidth='160' faiHeight='101' faiWidthOr='600' faiHeightOr='382'>
    <table id='formTable2256_module406' class='formTable' cellpadding='0' cellspacing='0'>

        <tr>
            <td class='imgp'>
                <table cellpadding='0' cellspacing='0'>
                    <tr>
                        <td>
                            <a hidefocus='true' href='h-pd-2256-2_406.html' target='_blank'>
                                <img alt='⑧北京汉奥汽配有限公司' title='' src='http://5003100.s21i-5.faiusr.com/2/ABUIABACGAAggsfqwAUotY6_qgUw2AQ4-gI!160x160.jpg'  />
                            </a>
                        </td>
                    </tr>
                </table>
            </td>

            <td style='' class='propList'>
                <p style='' class='propp productName    '>
                    <a class='fk-productName' hidefocus='true' href='h-pd-2256-2_406.html' target='_blank' title='⑧北京汉奥汽配有限公司'>⑧北京汉奥汽配有限公司</a>
                </p>

                <p class='propp productProp6    '>
                    <span class='propName fk-prop-name'>主营:</span>
                    <span class='propValue fk-prop-other'  style='text-decoration:none;font-family:微软雅黑;font-weight:normal;'>大众 新速腾 新迈腾 新桑塔纳 新捷达 CC 新帕萨特 新宝来 收事故车及残值(郭京汉)</span>
                </p>

                <p class='propp productProp4    '>
                    <span class='propName fk-prop-name'>地址:</span>
                    <span class='propValue fk-prop-other'  style='text-decoration:none;font-family:微软雅黑;font-weight:normal;'>城环城B-01号</span>
                </p>
            </td>
        </tr>

    </table>
</p>
EOT;

$dom = new Crawler();

$dom->addHtmlContent($str2, 'UTF-8');

$imgSrc = $dom->filter('td.imgp')->filter('img')->attr('src');

$productName = $dom->filter('td.propList')->filter('p.productName>a')->text();

$productProp6 = $dom->filter('td.propList')->filter('p.productProp6>.propValue')->text();

$productProp4 = $dom->filter('td.propList')->filter('p.productProp4>.propValue')->text();

var_dump($imgSrc);
echo '<br>';
var_dump($productName);
echo '<br>';
var_dump($productProp6);
echo '<br>';
var_dump($productProp4);
echo '<br>';

输出

巴扎黑

DOM自然是更好选择,然正则也不见得做不到。

/alt=\'(?P<name>[^\']+)\'(?:.+?)?src=\'(?P<img>[^\']+)\'(?:.+?)?主营:(?:.+?)?\'>(?P<scope>[^<]+)(?:.+?)?地址:(?:.+?)?\'>(?P<address>[^<]+)/s
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage