这是我在空闲时间做的一个项目,以帮助减少我在公司重复点击所花费的时间,所以我希望这不是冒犯或禁止。
我只想要第二个链接的URI,因为它是精确的搜索匹配。第一个还包含 -V1331 后缀。
错:
<a href="http://pdb2.turck.de/en/DE/products/0000000000011ba40002003a">
<strong> Product BI1-EH04-AP6X-V1331</strong> (HTML, 48.7K)<br>
Product <strong>BI1-EH04-AP6X-V1331</strong>
Click to enlarge Inductive sensor Order number: 4608440 Smooth barrel, Ø 4 mm Stainless steel, 1.4427 SO DC 3-wire, 10…30 VDC NO contact, PNP
</a>
右:
<a href="http://pdb2.turck.de/en/DE/products/000000000001ecee0003003a">
<strong> Product BI1-EH04-AP6X</strong> (HTML, 48.6K)<br>
Product <strong>BI1-EH04-AP6X</strong>
Click to enlarge Inductive sensor Order number: 4609540 Smooth barrel, Ø 4 mm Stainless steel, 1.4427 SO DC 3-wire, 10…30 VDC NO contact, PNP output
</a>
我试过这个:
$search = 'BI1-EH04-AP6X';
$crawler = Goutte::request('GET', 'http://www.turck.de/en/search.php?q_simple=' . $search);
return $crawler->selectLink(' Product ' . $search)->link()->getUri();
然而,这显然失败了,因为<a>
元素中有很多HTML,因此没有链接匹配。
请不要与Laravel的Goutte facade混淆,这是Symfony Dom Crawler方法。
如何获取第二个链接的URI?是否有匹配链接的方法,如果它包含搜索HTML代码段(在我们的案例中为> Product BI1-EH04-AP6X<
)?
答案 0 :(得分:0)
我通过试验XPath助手扩展和来自下面提到的SO页面的信息找到了答案。
Locating the node by value containing whitespaces using XPath
$search = 'BI1-EH04-AP6X';
$crawler = Goutte::request('GET', 'http://www.turck.de/en/search.php?q_simple=' . $search);
$crawler->filterXPath('//strong[normalize-space(text())="' . $search . '"]')->each(function ($node) {
print $node->parents()->link()->getUri()."\n";
});
它确实需要更多优化,但现在它还可以。