Php DOM和XPath抓取-返回两个li元素文本,而只需要一个

Php DOM和XPath抓取-返回两个li元素文本,而只需要一个,php,dom,xpath,screen-scraping,Php,Dom,Xpath,Screen Scraping,这是到目前为止我的代码 $dom_currys = new DOMDocument; libxml_use_internal_errors(TRUE); $dom_currys->loadHTMLFile('http://www.currys.co.uk/gbuk/apple-new-ipod-touch-8gb-4th-generation-07677427-pdt.html'); libxml_clear_errors(); $xpath_currys = new DOMXpath(

这是到目前为止我的代码

$dom_currys = new DOMDocument;
libxml_use_internal_errors(TRUE);
$dom_currys->loadHTMLFile('http://www.currys.co.uk/gbuk/apple-new-ipod-touch-8gb-4th-generation-07677427-pdt.html');
libxml_clear_errors();

$xpath_currys = new DOMXpath($dom_currys);
$nodes_currys = $xpath_currys->query(
    '/html/body/div/div/div[2]/div/div/div[2]/div/ul[2]/li/span'
);
$currys_stock_data = $nodes_currys->item(0)->nodeValue; // "Available for home delivery"

echo $currys_stock_data;
当回响时,它会带着

 Available for home delivery
 Available to reserve & collect 
我只需要送货上门部分。每一个元素都在一个单独的li元素中,但是它仍然会返回这两个元素,如果我想要第二个元素,XPath将是

/html/body/div/div/div[2]/div/div/div[2]/div/ul[2]/li[2]/span
我怀疑这与选择正确的项目有关,但不确定它是否正确

我还要求使用IF语句检查结果。到目前为止,我所拥有的:

if (strpos($currys_stock_data, 'Available for home') !== false) {
    $currys_stockyesno = "Yes";
} else {
    $currys_stockyesno = "No";
}
echo $currys_stockyesno;

我认为最好是检查它是否包含可用于送货上门的内容,而不是直接匹配,因为该网站有时会说它可以在2天内送货上门,大致如此。只要字符串包含该字符串,它就会返回true/yes。但是它说不…

我查看了一个你正在废弃的站点,发现li实际上是包含文本的内容。span上有一个图标类。由于复选标记图标发生变化,我们也需要对此进行检查。然而,看起来你并不真的需要文本,你需要检查物品是否允许送货上门

$xpath = "//li[contains(., 'Available for home delivery')]/span[class='icon icon-check']";
然后,只需检查长度:

if( $nodes_currys->length === 1 ) // true if available for home.
我还应该注意,这种方法在他们的搜索/浏览页面上不起作用,因为他们在那里使用图像……非常令人困惑,这也是为什么我讨厌刮擦:p

我检查了HTML源代码并确认了这一点

选择两个元素

如果只想选择两个文本节点中的第一个,请使用:


你为什么不按文档顺序选择第一个,用/html/body/div/div/div[2]/div/div/div[2]/div/ul[2]/li[1]/span?好问题,+1。请参阅我的答案以获得完整的解决方案。
/html/body/div/div/div[2]/div/div/div[2]/div/ul[2]/li
/html/body
      /div/div/div[2]
                /div/div/div[2]
                          /div/ul[2]/li[1]
                                      /span/following-sibling::text()