2012-02-17 66 views
1

我試圖從URL中獲取輸入框的值。我似乎在執行XPath時遇到了問題。PHP使用XPath刮 - html5問題?

被刮下的頁面看起來像:

<!DOCTYPE html> 
<html lang="en"> 
    <head></head> 
    <body> 
     <div><span>Blah</span></div> 
     <div><span>Blah</span> Blah</div> 
     <div> 
      <form method="POST" action="blah"> 
       <input name="SomeName" id="SomeId" value="GET ME"/> 
       <input type="hidden" name="csrfToken" value="ajax:3575644127378754050" id="csrfToken-login"> 
      </form> 
     </div> 
    </body> 
</html> 

,我嘗試分析它是這樣的:

$Contents = file_get_contents("https://www.linkedin.com/uas/login"); 
$Selector = "//input[@id='csrfToken-login']/@value"; 
print_r($Selector); 
$dom = new DOMDocument; 
libxml_use_internal_errors(true); 
$dom->loadHtml($Contents); 
$xpath = new DOMXPath($dom); 
libxml_use_internal_errors(false); 
print_r($xpath->query($Selector)); 

NB:dump()只是包裝print_r(),但增加了一些堆棧跟蹤信息和格式。

輸出是folllowws:

14:50:08 scraper.php 181: (Scraper->Test) 
//input[@id='csrfToken-login']/@value 

14:50:08 scraper.php 188: (Scraper->Test) 
DOMNodeList Object 
(
) 

這我假設意味着它無法找到它我選擇相匹配的文件中什麼?我已經嘗試了一些變化,僅僅指剛看我是否能得到東西回:

/input/@value 
/input 
//input 
/div 

,我已經能夠得到什麼唯一的選擇是從哪個/返回整個文檔。

我在做什麼錯?

編輯:由於有些不能重現舊示例的問題,我用幾乎相同的示例代替了它,它也演示了問題,但使用了公共URL(LinkedIn登錄頁面)。

有人建議,這是不可能的,因爲HTML5上的解析器窒息 - (如同內部頁面)任何人都有這方面的經驗?

+1

你不能轉儲任何DOM實例。他們不暴露他們的財產。即使你使用了正確的XPath'// input [@ id ='SomeId']/@ value',dump()結果也會顯示相同的空對象(儘管項目在那裏)。 – Gordon 2012-02-17 14:00:39

+0

@Gordon謝謝 - 不知道那個... – Basic 2012-02-17 14:47:34

+0

我編輯了Q以包含使用LinkedIn登錄頁面的「工作」示例。 – Basic 2012-02-17 14:51:48

回答

2

如果您的選擇器以單斜槓(/)開頭,則表示從根開始的絕對路徑。您需要使用雙斜線(//),它可以選擇所有匹配的元素,而不管它們的位置。

print_r對此不起作用。除了實際獲得價值之外,代碼中的一切都很好。 PHP中的列表類通常有一個名爲length的屬性,請檢查它。

$Contents = file_get_contents("https://www.linkedin.com/uas/login"); 
$Selector = "//input[@id='csrfToken-login']/@value"; 
$dom = new DOMDocument; 
libxml_use_internal_errors(true); 
$dom->loadHtml($Contents); 
$xpath = new DOMXPath($dom); 
libxml_use_internal_errors(false); 
$b = $xpath->query($Selector); 
echo $b->item(0)->value; 
+0

或提供從根的完整路徑 – Gordon 2012-02-17 14:05:04

+0

這似乎沒有解決我的問題 - 看看更新的示例 – Basic 2012-02-17 14:52:56

+0

感謝Uku Loskit,工作完美。 – Basic 2012-02-18 23:44:25

1

DOMXPath看起來不錯。

而對於使用XPath的後代或自身快捷//去輸入標籤

//input[@id='SomeId']/@value 
+0

謝謝,但我不認爲這是唯一的問題 - 我已更新示例以指向LinkedIn登錄頁面,其中可以看到相同的行爲。 – Basic 2012-02-17 15:04:55

0

我一直在您指定的LinkedIn登錄頁面,它是畸形的;即使您的縮減示例有一個未封閉的節點input。我對PHP的XPath實現一無所知,但我猜測沒有直接的XPath API可以處理格式錯誤的文檔。

順便說一句,您的XPath是正確的。

您可能需要一箇中間步驟,使用TagSoup在開始查詢之前「良好地」形成源代碼,或者Google爲任何PHP特定的解決方案/實現「標記湯php」。

我希望這有助於
扎卡里