解析HTML/JS代碼以使用PHP獲取信息。如何使用PHP解析HTML頁面?
www.asos.com/Asos/Little-Asos-Union-Jack-T-Shirt/Prod/pgeproduct.aspx?iid=1273626
看看這個頁面,這是一個兒童服裝店。這是他們的項目之一,我想指出尺寸部分。我們在這裏需要做的是獲得這個項目的所有尺寸,並檢查尺寸是否可用。現在這個項目的所有尺寸是:
3-4 years
4-5 years
5-6 years
7-8 years
你怎麼能說如果大小是否可用?
現在看看這個頁面第一,並再次檢查尺寸:
www.asos.com/Ralph-Lauren/Ralph-Lauren-Long-Sleeve-Big-Horse-Stripe-Rugby-Top/ ?PROD/pgeproduct.aspx IID = 1111751
此產品具有以下尺寸:
12 months
18 months - Not Available
24 months
正如你可以參見第18個月尺寸是不可用的,它是由「不可用」文本顯示旁邊尺寸。
我們需要做的是去一個項目的頁面,獲取尺寸,並檢查每個尺寸的可用性。我怎樣才能在PHP中做到這一點?
編輯:
添加一個工作代碼,並解決新的問題。
工作的代碼,但它需要更多的工作:
<?php
function getProductVariations($url) {
//Use CURL to get the raw HTML for the page
$ch = curl_init();
curl_setopt_array($ch,
array(
CURLOPT_RETURNTRANSFER=>true,
CURLOPT_HEADER => false,
CURLOPT_URL => $url
)
);
$raw_html = curl_exec($ch);
//If we get an invalid response back from the server fail
if ($raw_html===false) {
throw new Exception(curl_error($ch));
}
curl_close($ch);
//Find the variation JS declarations and extract them
$raw_variations = preg_match_all("/arrSzeCol_ctl00_ContentMainPage_ctlSeparateProduct\[[0-9]+\].*Array\((.*)\);/",$raw_html,$raw_matches);
//We are done with the Raw HTML now
unset($raw_html);
//Check that we got some results back
if (is_array($raw_matches) && isset($raw_matches[1]) && sizeof($raw_matches[1])==$raw_variations && $raw_variations>0) {
//This is where the matches will go
$matches = array();
//Go through the results of the bracketed expression and convert them to a PHP assoc array
foreach($raw_matches[1] as $match) {
//As they are declared in javascript we can use json_decode to process them nicely, they just need wrapping
$proc=json_decode("[$match]");
//Label the fields as best we can
$proc2=array(
"variation_id"=>$proc[0],
"size_desc"=>$proc[1],
"colour_desc"=>$proc[2],
"available"=>(trim(strtolower($proc[3]))=="true"),
"unknown_col1"=>$proc[4],
"price"=>$proc[5],
"unknown_col2"=>$proc[6], /*Always seems to be zero*/
"currency"=>$proc[7],
"unknown_col3"=>$proc[8],
"unknown_col4"=>$proc[9], /*Negative price*/
"unknown_col5"=>$proc[10], /*Always seems to be zero*/
"unknown_col6"=>$proc[11] /*Always seems to be zero*/
);
//Push the processed variation onto the results array
$matches[$proc[0]]=$proc2;
//We are done with our proc2 array now (proc will be unset by the foreach loop)
unset($proc2);
}
//Return the matches we have found
return $matches;
} else {
throw new Exception("Unable to find any product variations");
}
}
//EXAMPLE USAGE
try {
$variations = getProductVariations("http://www.asos.com/Asos/Prod/pgeproduct.aspx?iid=803846");
//Do something more useful here
print_r($variations);
} catch(Exception $e) {
echo "Error: " . $e->getMessage();
}
?>
上面的代碼工作,但是當產品需要您先選擇一種顏色,顯示尺寸之前,有一個問題。
贊一個:
不知道如何着手呢?
我剛剛發現選擇大小的選項由AJAX填充。如您所見,這是尺寸選擇DIV。填充此DIV的信息顯然來自AJAX與後端腳本的交互。單詞「不可用」不在HTML中,但當您打開SELECT窗體控件時,它們在屏幕上清晰呈現。因此,他們以其他方式進入DOM。 fopen和file_get_contents在這裏還能工作嗎? – GoDesigner 2010-08-21 13:58:18