首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Goutte解析-如何在包含文本字符串的元素之后找到一个元素

用Goutte解析-如何在包含文本字符串的元素之后找到一个元素
EN

Stack Overflow用户
提问于 2017-08-21 11:41:52
回答 2查看 2.8K关注 0票数 0

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

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

代码语言:javascript
复制
<tr>
<th>Website:</th>
<td>
    <a href="http://www.adres.com" target="_blank">http://www.adres.com</a>
</td>
</tr>

我试图从td元素中获取文本,该元素紧跟在th元素之后,该元素包含特定的字符串,在本例中为Website:

我的php如下所示:

代码语言:javascript
复制
$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:"
  • 我试图通过计数表的行来实现一些智能的目标定位,但是目标站点上的每个DB条目排列项目的方式不同,没有可靠的模式。

去做

使脚本从

EN

回答 2

Stack Overflow用户

发布于 2017-08-21 12:16:34

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

因此,在您的例子中,我将使用xpath选择器,特别是:following-sibling (参见https://stackoverflow.com/a/29380551/1997849)

票数 0
EN

Stack Overflow用户

发布于 2020-03-21 15:26:24

这是你问题的解决办法。

php_notes.php文件中的表。

代码语言:javascript
复制
<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文件中找到锚标记中的文本。

代码语言:javascript
复制
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');

您可以从这里“crawler.html”获得有关Symfony Crawler的帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45796228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档