PDA

View Full Version : حرفه ای: واکشی ( خواندن ) بخشی از یک صفحه html



reza_edu
پنج شنبه 04 مهر 1392, 22:32 عصر
سلام به همه دوستان

من با توابعی که زبان php برای خواندن محتویات یک آدرس url فراهم کرده است از آدرسی اطلاعاتی را واکشی می کنم و داخل متغییری قرار میدم این کار به راحتی انجام میشود اما من هدفم این هست که از محتویات دریافت شده بخشی را جدا کرده و عملیات های بعدی را روی اطلاعات جدا شده انجام بدم بطور مثال کد زیر رو نگاه کنید :


<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>sample</title>
</head>
<body>
<div id="warrper">
<div id="title">This sample</div>
<div class="title">another code something's this block</div>
</div>
</body>
</html>

من چطور میتونم کد های رو که داخل تگ "<div class="title">" هست رو جدا کرده { با تمامی محتویات } در جای ذخیره کنم ؟

کد های زیادی رو دیدم و تست کردم ولی جواب دلخواه رو نگرفتم

AliRezaPro
پنج شنبه 04 مهر 1392, 22:43 عصر
یعنی می خواین another code something's this block رو بدست بیارید ؟
با 1 خط jquery قابل انجام هست

a_ahmadi
جمعه 05 مهر 1392, 01:36 صبح
<?php
$string =
'<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>sample</title>
</head>
<body>
<div id="warrper">
<div id="title">This sample</div>
<div class="title">another code something\'s this block</div>
</div>
</body>
</html>
';
if( preg_match( '/<div class="title">(.*?)<\/div>/si' , $string , $match ))
$contecnt = $match[1];
echo $contecnt;
?>

reza_edu
جمعه 05 مهر 1392, 06:58 صبح
جناب a_ahmadi ممنون از پاسخ شما البته کمی نزدیک هست ولی نه آن چیزی که من می خواهم اگر با جوا اسکریپت کار کرده باشید میدانید که متودی دارد به نام innerHtml که با آن می توان محتویات هر تگی که سلکت شده است را بدست آورد من دنبال همچین موردی هستم .

این کد و کدهای مثل

$expression = '/div';
$prefix = 'fakeprefix';

$doc = new DOMDocument();
$doc->loadXML($xml);

$context = $doc->documentElement; // or whichever element you choose
$xpath = new DOMXPath($doc);


$result = $xpath->query($expression, $context)->item(0);

دیدم اما در نهایت کاربردی برای من نداشته

reza_edu
جمعه 05 مهر 1392, 07:14 صبح
این کد رو نگاه کنید :


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>samplecode</title>
</head>
<?php
$url = "http://www.khabaronline.ir/detail/314899";
$string = file_get_contents($url);
if( preg_match( '/<div class="newsBodyCont">(.*?)<\/div>/si' , $string , $match ))
$contecnt = $match[1];
echo $contecnt;
?>
<body>
</body>
</html>


وقتی اجراش می کنید تمامی محتویات رو درست نمی خونه :ناراحت:

reza_edu
جمعه 05 مهر 1392, 07:18 صبح
جناب AliRezaPro دوست گرامی مشکل من اینه که نمیشه سمت سرور از jquery یا javascript استفاده کرد { یا من بلد نیستم } وگرنه کلی از مشکلام حل می شد

AliRezaPro
جمعه 05 مهر 1392, 09:56 صبح
جناب AliRezaPro دوست گرامی مشکل من اینه که نمیشه سمت سرور از jquery یا javascript استفاده کرد { یا من بلد نیستم } وگرنه کلی از مشکلام حل می شد

میتوانید مقدار رو بدست بیاورید و پست کنید سمت سرور

reza_edu
جمعه 05 مهر 1392, 10:17 صبح
نه دیگه نمیشه چون عملیات فوق کاملا بصورت اتو ماتیک و سمت سرور انجام میشه و به هیچ مرورگری قرار نیست ارسال بشه یه اسکریپتی هست که سمت سرور قرار تو یه بازه زمانی انجام بشه و آدرس ها یکسان نیست برای خواندن

Javidhb
جمعه 05 مهر 1392, 11:21 صبح
php simple HTML DOM parser (http://simplehtmldom.sourceforge.net/) جون میده برای اینکار!!!

دانلود (http://sourceforge.net/projects/simplehtmldom/files/)



<?php
include('simple_html_dom.php');

$html=<<<H
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>sample</title>
</head>
<body>
<div id="warrper">
<div id="title">This sample</div>
<div class="title">another code something's this block</div>
<div class="title">another code something's this block</div>
</div>
</body>
</html>
H;

$html = str_get_html($html);

$divs = $html->find('div[class="title"]');

foreach ($divs as $div) {
echo $div->plaintext . PHP_EOL;
}
?>

reza_edu
جمعه 05 مهر 1392, 12:06 عصر
ممنون ولی تو عمل کارای نداره اینها مثال های انگلیسی هست که زیاد دیدم حتی خودمم هم مطرح کردم { البته اینی که شما گفتید کپی شده از سایت php.net هست )

Javidhb
جمعه 05 مهر 1392, 13:33 عصر
این یه کلاس معروف برای کار کردن با DOM و هیچ ربطی به سایت php.net نداره! چون جز کلاسهای پیش فرض php نیست...
کپی از php.net!!!!!!!!!!!!! باشه!!

به هر حال ...
اگه محتوای داخل div شامل tag های دیگه مثل لینک و ... رو هم میخای بجای plaintext باید از innertext استفاده کنی. این معادل همون innerHtml جاوااسکریپته که بالا گفتی...
برای گرفتن url هم بجای () str_get_html باید از یه چیزی شبیه این استفاده کنی! (کپی از لینکهایی ک تو پست بالایی گذاشتم!!!)


file_get_html('http://www.xxxxx/')

reza_edu
جمعه 05 مهر 1392, 14:09 عصر
ممنون از دوستان جیگر که لطف داشتن جواب رو کامل پیلا کردم خدا رو شکر :تشویق: میزارم که فردای روزگار دیگرانم استفاده کنن : :لبخندساده:



$dom = new DomDocument('1.0', 'UTF-8');
@$dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
$divs = $dom->getElementsByTagName('div');

foreach ($divs as $div) {
if($div->getAttribute('class')=='newsBodyCont'){
echo $dom->saveHTML($div);
}
}