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()