2017-03-31 71 views
0

這是一個項目,我在空閒時間幫助減少了在公司重複點擊所花的時間,所以我希望它不會被冒犯或禁止。Symfony DomCrawler鏈接包含搜索的HTML

Page to be scraped

Preview of the page

我只想要第二個鏈接的URI,因爲它是精確的搜索匹配。第一個也包含後綴-V1331後綴。

錯誤:

<a href="http://pdb2.turck.de/en/DE/products/0000000000011ba40002003a"> 
    <strong> Product&nbsp;BI1-EH04-AP6X-V1331</strong> (HTML, 48.7K)<br> 
    Product&nbsp;<strong>BI1-EH04-AP6X-V1331</strong> 
    Click to enlarge Inductive sensor Order number: &nbsp;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&nbsp;BI1-EH04-AP6X</strong> (HTML, 48.6K)<br> 
    Product&nbsp;<strong>BI1-EH04-AP6X</strong> 
    Click to enlarge Inductive sensor Order number: &nbsp;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&nbsp;' . $search)->link()->getUri(); 

然而,這顯然是失敗,因爲存在<a>元素裏面有很多的HTML ,因此沒有鏈接匹配。

請不要與Laravel的Goutte facade混淆,它是Symfony Dom Crawler方法。

如何獲取第二個鏈接的URI?有沒有匹配鏈接的方法,如果它包含搜索HTML片段(在我們的案例中是> Product&nbsp;BI1-EH04-AP6X<)?

回答

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"; 
}); 

它需要更多的優化,但現在它是還好吧。