DOM。从选项标记中的给定文本获取值属性

时间:2015-03-24 10:37:54

标签: php dom xpath css-selectors goutte

我试图通过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作为参数传递给文本。

希望我明确表示清楚,谢谢你。

2 个答案:

答案 0 :(得分:2)

参考文献:

  1. Symfony DomCrawler Component Documentation - Accessing DomCrawler Node Values
  2. DomCrawler API Reference - filterXPath() Method
  3. DomCrawler API Reference - extract() method
  4. Github Code View - DomCrawler::filter()
  5. DOMXPath::query()
  6. 首先,我将向您推荐DomCrawler :: filter()和DomCrawler :: filterXPath()方法是围绕DomCrawler :: filterRelativeXPath()私有方法的包装器。

    浏览filter()和filterXPath()方法的API参考,您会发现两者都将返回一个DomCrawler实例;可以从filterRelativeXPath()方法中查看。 filterRelativeXPath()方法依次使用PHP的XPath :: query()方法。

    Paul提供的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
    

答案 1 :(得分:1)

xpath表达式string(//option[.="7-Zip"]/@value)将找到任何<option>元素,其文本内容等于&#34; 7-Zip&#34;并将其 value 属性作为字符串返回。