DOM。从选项标签中的给定文本中获取值属性
DOM. Get value attribute from a given text in option tag
我正在尝试通过 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)
将找到文本内容等于“7-Zip”且 return 其 value 属性的任何 <option>
元素作为字符串。
参考文献:
- Symfony DomCrawler Component Documentation - Accessing DomCrawler Node Values
- DomCrawler API Reference - filterXPath() Method
- DomCrawler API Reference - extract() method
- Github Code View - DomCrawler::filter()
- DOMXPath::query()
首先,我建议您参考以下事实:DomCrawler::filter() 和 DomCrawler::filterXPath() 方法是 DomCrawler::filterRelativeXPath() 私有方法的包装器。
查看 filter() 和 filterXPath() 方法的 API 参考,您会注意到两者都将 return 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
我正在尝试通过 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)
将找到文本内容等于“7-Zip”且 return 其 value 属性的任何 <option>
元素作为字符串。
参考文献:
- Symfony DomCrawler Component Documentation - Accessing DomCrawler Node Values
- DomCrawler API Reference - filterXPath() Method
- DomCrawler API Reference - extract() method
- Github Code View - DomCrawler::filter()
- DOMXPath::query()
首先,我建议您参考以下事实:DomCrawler::filter() 和 DomCrawler::filterXPath() 方法是 DomCrawler::filterRelativeXPath() 私有方法的包装器。
查看 filter() 和 filterXPath() 方法的 API 参考,您会注意到两者都将 return 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