0

我正在使用https://github.com/FriendsOfPHP/Goutte来解析和提取数据,我做得很好......

但是现在我偶然发现了一个有点不友好的地方:

<tr>
<th>Website:</th>
<td>
    <a href="http://www.adres.com" target="_blank">http://www.adres.com</a>
</td>
</tr>

在这种情况下,我正在尝试从td紧跟在th包含特定字符串的元素之后的元素中获取文本。Website:

我的 php 看起来像这样:

$client3 = new \Goutte\Client();
$crawler3 = $client3->request('GET', $supplierurl . 'contactinfo.html');

if($crawler3->filter('th:contains("+Website+") + td a')->count() > 0) {
    $parsed_company_website_url = $crawler3->filter('th:contains("Website:") + td')->text();
} else {
    $parsed_company_website_url = null;
}
return $parsed_company_website_url;

问题

我的代码不起作用。

我的尝试
  • 我尝试同时使用"+Website+""Website:"
  • 我试图通过计算表的行数来进行一些智能定位,但是目标站点上的每个数据库条目以不同的方式排列项目,没有可靠的模式。

去做

使脚本从

4

2 回答 2

0

似乎这contains()是一个 jquery 功能,而不是一个 css 选择器。使用 css,您可以检查属性值,但不能检查标记内的文本节点。

所以,在你的情况下,我会使用 xpath 选择器,尤其是:(following-siblinghttps://stackoverflow.com/a/29380551/1997849

于 2017-08-21T12:16:34.790 回答
0

这是您问题的解决方案。

php_notes.php 文件中的表。

<table id="table" border="1">
    <tr>
    <a href="">xyz</a>
    <a href="">abc</a>
    <h1>Heading</h1>
    <th>Website:</th>
    <td>
        <a href="http://www.adres.com" target="_blank">http://www.adres.com</a>
    </td>
    <th>Website:abc</th>
    <td>
        <a href="http://www.adres.com" target="_blank">http://www.ares.com</a>
    </td>
    </tr>
</table>

Crawler.php 从 php_notes.php 文件中找到锚标记中的文本。

use Weidner\Goutte\GoutteFacade;
use Symfony\Component\DomCrawler\Crawler;

$crawler = GoutteFacade::request('GET','http://localhost/php_notes.php');

        $table = $crawler->filter('#table'); // find the parent table 

        // find each td tag
        $tdText = $table->filter('td')->each(function ($node){

            $alike = $node->previousAll(); // calculate the elements of the same level above this 
            //element :Will return array containing the tags above this tag.

            // dump('Size of array => '.sizeof($alike));
            $elementTag = $alike->eq(0); // find the tag above this <td> tag. 

            // if the tag above this tag is a <th> tag
            if($elementTag->nodeName()=='th'){
                if($elementTag->text()=='Website:')
                {
                    $text = $node->filter('a')->text();

                    dd('Text found form td "'.$text.'"');
                }
            }

        });

        dd('Not Text Was Found From A tag');

您可以从这里获得有关 Symfony Crawler 的帮助' https://symfony.com/doc/current/components/dom_crawler.html '

于 2020-03-21T15:26:24.507 回答