【问题标题】:Symfony DOMCrawler break from eachSymfony DOMCrawler 从每个中断
【发布时间】:2017-03-22 12:32:40
【问题描述】:

我正在尝试使用 DOMCrawler 过滤我的 html,但如果找到结果,我需要中断。

是否可以脱离each
或者如果我使用foreach,我怎样才能得到$node->text();?还是不可能?

HTML:

<table cellspacing="0" cellpadding="0" align="Center" rules="all" border="1">
    <tbody>
    <tr>
        <td>Entity Name</td>
        <td>NV Business ID</td>
        <td>Status</td>
        <td>Type</td>
    </tr>
    <tr>
        <td><a href="">GOOGLE</a></td>
        <td><a href=""></a></td>
        <td><a href="">Expired</a></td>
        <td><a href="">Reserved Name</a></td>
    </tr>
    <tr>
        <td><a href="">GOOGLE INC.</a></td>
        <td><a href="">NV20161275322</a></td>
        <td><a href="">Active</a></td>
        <td><a href="">Foreign Corporation</a>
        </td>
    </tr>
    </tbody>
</table>

PHP:

$client = new Client();
$client->setHeader('User-Agent', "Opera/9.80 (Windows NT 6.2; Win64; x64) Presto/2.12.388 Version/12.15");
$crawler = $client->request('GET', 'http://nvsos.gov/sosentitysearch/');
$form = $crawler->selectButton('Search')->form();
$crawler = $client->submit($form, array(
    'ctl00$MainContent$txtSearchBox' => 'google',
));
if($this->available == false)return;
$crawler->filter('table tr')->each(function (\Symfony\Component\DomCrawler\Crawler $element) {
    $status = $element->filter('td')->eq(2)->text();
    echo $status;
    if ($status == 'Active') {
        $this->available = false;
        break;
    }
});

我想获得状态。然后如果状态等于“活动”,我想打破循环。


好的,现在我想出了一些办法。

$crawler = $crawler->filter('#ctl00_MainContent_objSearchGrid_dgCorpSearchResults');
foreach ($crawler as $i => $content) {
    $crawler = new Crawler($content);
    foreach ($crawler->filter('#ctl00_MainContent_objSearchGrid_dgCorpSearchResults') as $node) {
        $longStatus = $node->nodeValue;
        echo $longStatus;
    }
}

但现在我不知道如何在&lt;tr&gt; 中获得第三个&lt;td&gt;

【问题讨论】:

  • 看起来不可能。
  • 你能给出一个示例文档并描述你想要得到的结果吗?
  • @xabbuh 嘿,更新了我的问题。
  • 您是否尝试返回而不是中断?
  • 是的,这是我首先尝试的。它只是打印所有结果而不是破坏它。

标签: php symfony domcrawler


【解决方案1】:

虽然你不能从$crawler-&gt;each() 中断,当然你不能使用break 来退出一个函数,并且没有什么可以返回,所以$crawler-&gt;each() 将停止迭代,但你仍然有几个选项。

  1. 例外情况
    退出大多数功能始终是一种选择。
  2. foreach
    当你自己得到它时,你可以从$crawler-&gt;each() 切换到foreach。 但它比你想象的要简单。只需更换
    $crawler->each(function($element) {
       your_code();
    });
    
    foreach($crawler as $content) {
        $element = new Crawler($content);
        your_code();
    }
    
    无需更改代码中的任何内容。你的原始代码变成
    ...
    foreach($crawler->filter('table tr') as $context) {
        $element = new Crawler($content);
        $status = $element->filter('td')->eq(2)->text();
        echo $status;
        if ($status == 'Active') {
            $this->available = false;
            break;
        }
     }
    
    而且你仍然可以以同样的方式在&lt;tr&gt; 中获得第三个&lt;td&gt;

【讨论】:

  • 我不得不使用你的 foreach 方法在循环内调用$client-&gt;click(...)。使用 $crawler-&gt;each() 在循环内尝试新请求时,我的 PHP 脚本失败。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-08
  • 1970-01-01
  • 1970-01-01
  • 2016-06-07
  • 1970-01-01
  • 2017-01-11
  • 2016-01-21
相关资源
最近更新 更多