DOM. Получить атрибут значения из заданного текста в теге option

Я пытаюсь получить значение из заданного текста с помощью селектора 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 в качестве аргумента, кроме текста.

Надеюсь, я дал понять, заранее спасибо.

0

Решение

Выражение xpath string(//option[.="7-Zip"]/@value) найдет любой <option> элемент, текстовое содержимое которого равно «7-Zip» и возвращает его значение атрибут в виде строки.

1

Другие решения

Рекомендации:

  1. Документация по компонентам Symfony DomCrawler — Доступ к значениям узла DomCrawler
  2. Справочник по DomCrawler API — метод filterXPath ()
  3. Справочник по DomCrawler API — метод extract ()
  4. Github Code View — DomCrawler :: filter ()
  5. DOMXPath :: запрос ()

Для начала я бы сослался на тот факт, что методы 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
2

По вопросам рекламы [email protected]