Simple HTML Dom İle Alakalı
-
Hocalar aşşağıdaki kod öbeğinde title intro falan alıp atricles diye bi diziye atmış ama ben <strong style="color: #002166; font-family: Monaco, Verdana, sans-serif; font-size: 11px;">find('div.title', 0) daki '0' muhabbetini anlamadım. Araştırdım ama pek bi sonuca ulaşamadım bilen varmıdır?
Ek olarak ben şu şekilde kullandığımda fatal alıyorum nedendir?
foreach($html->find('table[class=price-list-table]') as $element){
$item['tarih'] = find('thead',0)->plaintext;
echo $item['tarih'];
}
------------------- aşşağısı simple html dom un kodları ---------------------
// Create DOM from URL
Nvidia tarafından 19/Ara/16 17:14 tarihinde düzenlenmiştir
$html =file_get_html('http://slashdot.org/');
// Find all article blocks
foreach($html->find('div.article') as $article) {
$item['title'] = $article->find('div.title', 0)-> plaintext;
$item['intro'] = $article->find('div.intro', 0)-> plaintext;
$item['details'] = $article->find('div.details', 0)-> plaintext;
$articles[] = $item;
} -
http://simplehtmldom.sourceforge.net/manual.htm#section_find
$ret = $html->find('a');
// Find (N)th anchor, returns element object or null if not found (zero based)
$ret = $html->find('a', 0);
// Find lastest anchor, returns element object or null if not found (zero based)
$ret = $html->find('a', -1);
// Find allwith the id attribute
$ret = $html->find('div[id]');
// Find allwhich attribute id=foo
$ret = $html->find('div[id=foo]');seçilen elementlerden ilgili index numarasına sahip olanı geri döndürüyor.
HTML kodlarının içinde 5 tane div olsun$html->find('div') 5ini,
$html->find('div', 0) ilkini
$html->find('div', 1) ikincisini
...
$html->find('div', -1) sonuncusnu geri döndürür.JQuery'deki eq() karşılığı.
PcK0 tarafından 19/Ara/16 18:13 tarihinde düzenlenmiştir -
PcK0 bunu yazdı
http://simplehtmldom.sourceforge.net/manual.htm#section_find
$ret = $html->find('a');
// Find (N)th anchor, returns element object or null if not found (zero based)
$ret = $html->find('a', 0);
// Find lastest anchor, returns element object or null if not found (zero based)
$ret = $html->find('a', -1);
// Find allwith the id attribute
$ret = $html->find('div[id]');
// Find allwhich attribute id=foo
$ret = $html->find('div[id=foo]');seçilen elementlerden ilgili index numarasına sahip olanı geri döndürüyor.
HTML kodlarının içinde 5 tane div olsun$html->find('div') 5ini,
$html->find('div', 0) ilkini
$html->find('div', 1) ikincisini
...
$html->find('div', -1) sonuncusnu geri döndürür.JQuery'deki eq() karşılığı.
ek olarak dökümantasyon diyor ki,
// Find all anchors, returns a array of element objects
$ret = $html->find('a');
array döndürüyor. Yani find('div')[0]'ın da kontrol ettiğin elementin içindeki aradığın tag'a sahip ilk elementini vermesi gerekir. find('div',0) ile aynı şeydir.(sonuç olarak, indexing algoritmasını bilmediğim için performans olarak aynımıdır bilemiyorum)
E amk PHP imiş farketmedim2. olarak kodun yanlış, for each'te as $element yapıp iteration içinde sadece find('thead',0) yazmışsın, neyin içinde thead bulacak bu kod ? o belirtilmemiş. $element'te find('thead',0) yaparsan çalışması lazım, Ayrıca her loopta $item['tarih']'i değiştirmeyi anlamadım, item array'ına yeni tarih eklemek için push kullanman lazım. Ayrıca $element'i foreach bittikten sonra çalıştırılan array'in en son üyesine set olmuş halde kullanmayacaksan,manipülasyon yapmayacaksan unset() et.
table.price-list-table'ı table[class=price-list-table] olarak yazmak ilginçAma simple dom diye birşey kullanacağına direk düz vanilla javascript kullansana maximum performans alasın ? (Bunu React'ın virtual dom gibi ekstra teknolojilerine sahip olmadığı tahmin ederek söylüyorum)
document.getElementsByTagName('table').getElementsByClassName("price-list-table").forEach(function(element,index){
$item['tarih'].push(element.getElementsByTagName('thead')[0].textContent); // textContent yerine innerText, innerHTML olabilir, duruma bağlı
console.log(index + ". veri -> "$item['tarih']);
});
CTRL+SHIFT+ı yaparak sonucu kontrol edebilirsin.
kvasir tarafından 19/Ara/16 20:40 tarihinde düzenlenmiştir -
hocam ikinci değerler diğer arkadaşlarında dediği gibi index değerleri. Yani article in altındaki ilk title ı getiriyor. veri çekme işlemleriyle uğraşacaksanız simple html dom yerine python beatifulsoup araştırmanızı öneririm
-
Hocam classı açıp find fonksiyonuna baktığımızda 2. argüman girilmişse girilen index, girilmemişse bütün değerler -array olarak- dönüyor.
Yazdığınız koda göre 2 değer girilmemiş
$html->find('table[class=price-list-table]') array olarak dönecek bu yüzden php foreach kullanımına bakmanız gerekiyor.
Doğru kod böyle olmalı
foreach($html->find('table[class=price-list-table]') as $element){
$item['tarih'] = $element->find('thead',0)->plaintext;
echo $item['tarih'];
}
mrbrs tarafından 20/Ara/16 01:00 tarihinde düzenlenmiştir
