Я пытаюсь получить значение из заданного текста с помощью селектора CSS или выражения xpath, но я не знаю, возможно ли это осуществить или нет.
Это мой HTML:
<select name="product" style="width: 430px">
<option value="0" selected="selected"></option>
<option value="3181">389-ds-base</option>
<option value="3511">7-Zip</option>
Допустим, я хочу получить значение 3511, указав текст.
Причина, по которой я этого хочу, заключается в том, что я хочу выполнять сканирование в Интернете следующим образом:
require_once '/root/PHP/goutte.phar';
use Goutte\Client;
$client = new Client();
$crawler = $client->request('GET', 'https://oval.mitre.org/repository/data/search/');
$form = $crawler->selectButton('Search')->form();
$crawler = $client->submit($form, array('product' => '3511'));
$nodeValues = $crawler->filterXPath('//td[@nowrap][position()>4]/a')->each(function ($node) {
return $node->text();
});
И я не хочу передавать число 3511 в качестве аргумента, кроме текста.
Надеюсь, я дал понять, заранее спасибо.
Выражение xpath string(//option[.="7-Zip"]/@value)
найдет любой <option>
элемент, текстовое содержимое которого равно «7-Zip» и возвращает его значение атрибут в виде строки.
Рекомендации:
Для начала я бы сослался на тот факт, что методы DomCrawler :: filter () и DomCrawler :: filterXPath () являются оболочками вокруг закрытого метода DomCrawler :: filterRelativeXPath ().
Взглянув на ссылку API для методов filter () и filterXPath (), вы заметите, что оба возвращают экземпляр DomCrawler; как видимый из метода filterRelativeXPath (). Метод filterRelativeXPath (), в свою очередь, использует PHP-метод XPath :: query ().
Выражение XPath, предоставленное Полом, хотя и технически верно, но не будет работать с контекстом Symfony DomCrawler. На самом деле, если вы должны были сделать:
$value = $crawler->filterXPath('string(//option[.="7-Zip"]/@value)');
вы, вероятно, получите сообщение об ошибке или предупреждение от DOMXPath :: query ()
При использовании компонента Symfony DomCrawler вы должны будете сделать что-то вроде:
$value = $crawler->filterXPath('//option[.="7-Zip"]/') // get the node
->extract(['value'])[0]; // extract the value attribute and then associate the first element of the resulting array to $value