XPath, XML Path Language ifadesinin kısaltmasıdır ve temel olarak XML belgeleri üzerinde gezinmek, belirli düğümleri veya öznitelikleri seçmek için kullanılan güçlü bir sorgulama dilidir. Web dünyasında XPath, özellikle web scraping, test otomasyonu ve veri madenciliği gibi alanlarda öne çıkar. Çünkü modern web sitelerinin büyük bir kısmı, HTML veya XML tabanlı yapılar kullanır ve bu yapılarda belirli bir öğeye ulaşmak için XPath’in esnekliği ve gücü büyük avantaj sağlar.
XPath’in temel amacı, bir XML ya da HTML dokümanında istenen veriye ulaşmak için yol tarif etmektir. Bunu, bir haritada adres bulmak gibi düşünebilirsiniz. Her bir öğe, belge içinde bir konuma sahiptir ve XPath, bu konuma ulaşmak için bir yol tanımlar. Örneğin, bir e-ticaret sitesinde ürün başlıklarını, fiyatlarını ya da açıklamalarını çekmek istediğinizde, her bir öğenin sayfa içindeki konumunu XPath ile tarif edebilirsiniz. XPath, hem basit hem de karmaşık sorgular oluşturmanıza olanak tanır. Sadece bir etiketi seçmekle kalmaz, aynı zamanda belirli bir özelliğe sahip olan, belirli bir metni içeren veya belirli bir hiyerarşide yer alan öğeleri de seçebilirsiniz.
XPath’in en büyük avantajlarından biri, HTML ve XML belgelerinin karmaşık ve iç içe geçmiş yapılarında bile, istenen veriye hızlı ve kesin bir şekilde ulaşabilmesidir. Özellikle web scraping işlemlerinde, CSS seçiciler bazen yetersiz kalabilirken, XPath ile çok daha detaylı ve hassas seçimler yapmak mümkündür. Test otomasyonunda ise, örneğin Selenium gibi araçlarla, bir web sayfasındaki belirli bir butona, form alanına veya menüye ulaşmak için XPath sıkça kullanılır. Bu sayede, otomasyon senaryoları daha esnek ve dayanıklı hale gelir.
XPath’in temel yapısı, yol ifadeleriyle çalışır. Bir yol ifadesi, kök düğümden başlayarak istenen öğeye kadar olan yolu tanımlar. Bu yol, mutlak (absolute) ya da göreli (relative) olabilir. Mutlak yol, dokümanın en başından başlayarak her adımı tek tek belirtirken, göreli yol ise mevcut konumdan başlayarak hedefe ulaşır. Bu iki yaklaşım, XPath’in esnekliğini ve farklı kullanım senaryolarına uyumunu artırır.
XPath, sadece etiketleri değil, aynı zamanda öznitelikleri, metin içeriklerini ve hatta belirli koşulları da sorgulayabilir. Örneğin, bir tablodaki sadece belirli bir değeri içeren satırları seçmek mümkündür. Ayrıca, XPath ile birden fazla öğeyi aynı anda seçebilir, filtreler ve fonksiyonlar kullanarak sorgularınızı daha da özelleştirebilirsiniz.
XPath Türleri Nelerdir?
XPath, temel olarak iki ana türde yol tanımlama yaklaşımı sunar: Absolute (Mutlak) XPath ve Relative (Göreli) XPath. Bu iki tür, bir XML veya HTML dokümanında hedeflenen öğeye ulaşmak için farklı yol tarifleri kullanır. Her iki yaklaşımın da kendine özgü avantajları ve kullanım alanları vardır. XPath’in bu iki temel türü dışında, çeşitli fonksiyonlar, eksenler (axes), filtreler ve koşullu ifadelerle zenginleştirilebilen karmaşık sorgular da oluşturulabilir. Ancak, pratikte en çok karşılaşılan ve kullanılan yol tanımlama biçimleri mutlak ve göreli XPath’tir.
Absolute XPath, dokümanın kökünden başlayarak hedef öğeye kadar olan tüm yolu adım adım belirtir. Yani, yolun başında her zaman tek bir eğik çizgi (/) bulunur ve bu, kök düğümden itibaren ilerlenerek her bir ara düğümün açıkça yazılması anlamına gelir. Bu yöntem, özellikle dokümanın yapısı sabit ve değişmeyen projelerde tercih edilir. Çünkü sayfa yapısında bir değişiklik olduğunda, mutlak yolun bozulma riski yüksektir. Absolute XPath, genellikle hızlı ve doğrudan seçimler yapmak için kullanılır, ancak esnekliği sınırlıdır.
Relative XPath ise, mevcut konumdan veya belirli bir referans noktasından başlayarak hedef öğeye ulaşmayı sağlar. Bu türde yolun başında çift eğik çizgi (//) bulunur ve bu, dokümanın herhangi bir yerinden arama yapılabileceği anlamına gelir. Relative XPath, özellikle dinamik ve sık değişen sayfa yapılarında daha dayanıklıdır. Çünkü yolun tamamını baştan sona yazmak yerine, sadece ilgili bölümü ve hedef öğeyi tanımlamak yeterlidir. Bu da, test otomasyonu ve web scraping gibi alanlarda relative XPath’in daha çok tercih edilmesini sağlar.
XPath’in bu iki temel türü dışında, çeşitli fonksiyonlar ve filtreler de kullanılabilir. Örneğin, belirli bir özniteliğe sahip olan öğeleri seçmek için [@attribute=’değer’] yapısı, belirli bir metni içeren öğeleri bulmak için contains() fonksiyonu veya pozisyona göre seçim yapmak için [1], [last()] gibi ifadeler kullanılabilir. Ayrıca, XPath’in sunduğu axes (child, parent, ancestor, descendant, sibling gibi) ile belge içinde çok daha esnek ve güçlü sorgular oluşturmak mümkündür.
XPath türleri arasında seçim yaparken, projenin ihtiyaçları, dokümanın yapısı ve hedeflenen öğenin konumu dikkate alınmalıdır. Absolute XPath, hızlı ve doğrudan seçimler için uygunken, relative XPath daha esnek ve değişime dayanıklı çözümler sunar. Fonksiyonlar ve filtrelerle zenginleştirilen XPath ifadeleri ise, karmaşık veri çekme ve otomasyon senaryolarında büyük kolaylık sağlar. XPath’in bu esnek yapısı, onu hem basit hem de ileri düzey projelerde vazgeçilmez bir araç haline getirir.
Absolute XPath
Absolute XPath, bir XML veya HTML dokümanında hedeflenen öğeye ulaşmak için kök düğümden başlayarak tüm yolu adım adım açıkça tanımlar. Bu yöntemde, yolun başında tek bir eğik çizgi (/) bulunur ve bu, dokümanın en başından itibaren ilerlenerek her bir ara düğümün sırasıyla yazılması gerektiği anlamına gelir. Örneğin, bir web sayfasında belirli bir başlığa ulaşmak için kullanılan absolute XPath şöyle görünebilir:
/html/body/div[2]/div[1]/h1
Bu örnekte, yolun her adımı tek tek belirtilmiştir. Önce html kök etiketi, ardından body, sonra ikinci div, birinci div ve son olarak h1 etiketi. Absolute XPath’in en büyük avantajı, hedef öğeye doğrudan ve hızlı bir şekilde ulaşmayı sağlamasıdır. Ancak, bu yöntemin en büyük dezavantajı, sayfa yapısında herhangi bir değişiklik olduğunda yolun bozulma riskinin yüksek olmasıdır. Örneğin, sayfada yeni bir div eklendiğinde veya mevcut yapı değiştiğinde, absolute XPath’in işaret ettiği öğe değişebilir ya da bulunamaz hale gelebilir.
Absolute XPath, genellikle sayfa yapısının sabit olduğu, öğelerin konumunun değişmediği projelerde tercih edilir. Web scraping işlemlerinde, hızlıca veri çekmek için kullanılabilir. Ancak, test otomasyonu gibi dinamik ortamlarda, sayfa yapısının sık değiştiği durumlarda absolute XPath kullanmak, bakım zorluğu ve kırık link riski doğurur. Bu nedenle, absolute XPath’in kullanımı genellikle kısa vadeli veya sabit yapılı projelerle sınırlı kalır.
Absolute XPath’in bir diğer özelliği, yolun tamamının baştan sona yazılması gerektiğidir. Yani, kök düğümden başlayarak hedef öğeye kadar olan tüm ara düğümler ve indeksler açıkça belirtilmelidir. Bu, hem okunabilirliği azaltır hem de hata yapma riskini artırır. Özellikle büyük ve karmaşık dokümanlarda, absolute XPath’in uzun ve karmaşık hale gelmesi mümkündür.
Buna rağmen, absolute XPath’in bazı avantajları da vardır. Özellikle, belirli bir öğenin tam olarak nerede olduğunu bilmek ve bu öğeye doğrudan ulaşmak istendiğinde, absolute XPath hızlı ve etkili bir çözüm sunar. Ayrıca, bazı otomasyon araçları ve tarayıcı eklentileri, öğe seçimi sırasında otomatik olarak absolute XPath üretir. Bu da, hızlı prototipleme ve test senaryoları oluşturmak için pratik bir yol sağlar.
Absolute XPath kullanırken dikkat edilmesi gereken en önemli nokta, sayfa yapısının değişmesi durumunda yolun güncellenmesi gerektiğidir. Bu nedenle, uzun vadeli ve sürdürülebilir projelerde, mümkünse relative XPath veya daha esnek seçim yöntemleri tercih edilmelidir. Ancak, sabit yapılı ve değişmeyen dokümanlarda, absolute XPath ile hızlı ve doğrudan seçimler yapmak mümkündür.

Relative XPath
Relative XPath, bir XML veya HTML dokümanında hedeflenen öğeye ulaşmak için mevcut konumdan veya belirli bir referans noktasından başlayarak yol tanımlar. Bu yöntemde, yolun başında çift eğik çizgi (//) bulunur ve bu, dokümanın herhangi bir yerinden arama yapılabileceği anlamına gelir. Relative XPath, absolute XPath’e göre çok daha esnek ve dayanıklıdır. Çünkü yolun tamamını baştan sona yazmak yerine, sadece ilgili bölümü ve hedef öğeyi tanımlamak yeterlidir.
Örneğin, bir web sayfasında belirli bir başlığı seçmek için kullanılan relative XPath şöyle olabilir:
//h1
Bu ifade, dokümandaki tüm h1 etiketlerini seçer. Daha spesifik bir seçim yapmak için, öznitelik veya metin içeriği de kullanılabilir:
//div[@class=’product-title’]
Bu örnekte, class özniteliği “product-title” olan tüm div etiketleri seçilir.
Relative XPath’in en büyük avantajı, sayfa yapısında yapılan değişikliklerden minimum düzeyde etkilenmesidir. Çünkü yolun başında kök düğümden başlamak yerine, doğrudan hedef öğeye veya belirli bir özelliğe sahip olan öğeye ulaşmak mümkündür. Bu da, özellikle dinamik ve sık değişen web sitelerinde relative XPath’in daha çok tercih edilmesini sağlar. Test otomasyonu ve web scraping işlemlerinde, relative XPath ile daha dayanıklı ve sürdürülebilir çözümler üretmek mümkündür.
Relative XPath, sadece etiketleri değil, aynı zamanda öznitelikleri, metin içeriklerini ve belirli koşulları da sorgulayabilir. Örneğin, belirli bir metni içeren öğeleri seçmek için contains() fonksiyonu kullanılabilir:
//a[contains(text(),’Devamını Oku’)]
Bu ifade, metni “Devamını Oku” olan tüm bağlantıları seçer. Ayrıca, pozisyona göre seçim yapmak için [1], [last()] gibi ifadeler de kullanılabilir:
//ul/li[1]
Bu örnek, tüm ul etiketlerindeki ilk li öğesini seçer.
Relative XPath’in bir diğer avantajı, okunabilirliğinin ve bakımının daha kolay olmasıdır. Çünkü yolun tamamını baştan sona yazmak gerekmez, sadece ilgili bölümü ve hedef öğeyi tanımlamak yeterlidir. Bu da, büyük ve karmaşık dokümanlarda relative XPath’in daha pratik ve kullanışlı olmasını sağlar.
Relative XPath kullanırken dikkat edilmesi gereken en önemli nokta, seçimin çok genel olmamasıdır. Çünkü çok genel ifadeler, birden fazla öğeyi seçebilir ve istenmeyen sonuçlara yol açabilir. Bu nedenle, mümkün olduğunca spesifik ve hedefe yönelik seçimler yapmak önemlidir. Doğru kullanıldığında, relative XPath ile hem esnek hem de dayanıklı veri çekme ve otomasyon senaryoları oluşturmak mümkündür.
XPath’in Temel Kavramları Nelerdir?
XPath, XML ve HTML belgelerinde veri seçimi ve işleme konusunda güçlü bir araçtır. Ancak bu gücü verimli kullanabilmek için, XPath’in temel kavramlarını iyi anlamak gerekir. XPath’in sunduğu esneklik ve detaylı sorgulama yeteneği, büyük ölçüde bu temel kavramlar üzerine kuruludur. Node (düğüm), attribute (öznitelik), parent (ebeveyn) ve child (çocuk) gibi kavramlar, bir belgenin yapısını anlamak ve doğru sorgular oluşturmak için vazgeçilmezdir.
Bir XML veya HTML belgesi, hiyerarşik bir yapıdadır. Bu yapı, kök düğümden başlayarak dallanır ve her bir öğe, kendi içinde başka öğeler veya öznitelikler barındırabilir. XPath, bu hiyerarşiyi kullanarak, istenen veriye ulaşmak için yol tarifleri oluşturur. Temel kavramlar, bu yol tariflerinin temel taşlarıdır. Örneğin, bir düğümün ebeveynini, çocuklarını veya özniteliklerini seçmek için bu kavramları kullanmak gerekir.
Node (düğüm), belgedeki her bir yapısal birimi ifade eder. Bir etiket, bir metin, bir öznitelik ya da bir yorum, hepsi birer düğümdür. Attribute (öznitelik), bir etiketin sahip olduğu ek bilgileri tanımlar. Parent (ebeveyn), bir düğümün doğrudan üstünde yer alan düğümdür. Child (çocuk) ise, bir düğümün doğrudan altında yer alan düğümleri ifade eder. Bu kavramlar, XPath’in sunduğu eksenler (axes) ve fonksiyonlarla birleştiğinde, çok daha karmaşık ve güçlü sorgular oluşturmak mümkün olur.
XPath’in temel kavramlarını iyi anlamak, hem basit hem de karmaşık veri çekme işlemlerinde büyük kolaylık sağlar. Özellikle web scraping, test otomasyonu ve veri analizi gibi alanlarda, doğru düğümü, özniteliği veya ilişkili öğeyi seçmek için bu kavramların mantığını kavramak gerekir. XPath’in sunduğu bu yapı taşları, belge içinde gezinmeyi ve istenen veriye ulaşmayı son derece pratik hale getirir.
Node (Düğüm)
Node, yani düğüm, XML ve HTML belgelerinin temel yapı taşıdır. Bir belgeyi bir ağaç gibi düşünürsek, her bir dal, yaprak ve kök aslında birer düğümdür. XPath’in en önemli kavramlarından biri olan node, belge içindeki her bir yapısal birimi temsil eder. Bir etiket (örneğin <div>), bir metin (örneğin bir paragraf içindeki yazı), bir öznitelik (örneğin class=”header”), bir yorum ya da bir işlem talimatı, hepsi birer düğümdür.
Bir XML veya HTML belgesi, kök düğümden başlar ve alt düğümlerle dallanır. Örneğin, bir HTML belgesinde kök düğüm <html> etiketidir. Bunun altında <head> ve <body> gibi alt düğümler yer alır. Her bir alt düğüm, kendi içinde başka düğümler barındırabilir. Bu hiyerarşi, belgeyi hem okunabilir hem de işlenebilir kılar. XPath, bu düğümler arasında gezinmek ve istenen veriye ulaşmak için kullanılır.
XPath’te node seçimi için çeşitli yollar vardır. Örneğin, tüm düğümleri seçmek için //* ifadesi kullanılır. Belirli bir etiketi seçmek için ise, örneğin tüm <div> etiketlerini seçmek için //div yazılır. Düğümün türüne göre de seçim yapılabilir. Metin düğümleri için text(), öznitelik düğümleri için @attribute gibi ifadeler kullanılır.
Node kavramı, sadece veri çekmek için değil, aynı zamanda belge içinde gezinmek ve ilişkili öğeleri bulmak için de önemlidir. Bir düğümün ebeveynini, çocuklarını, kardeşlerini veya özniteliklerini seçmek için node yapısını iyi anlamak gerekir. Özellikle karmaşık belgelerde, doğru düğümü seçmek için node ilişkilerini kullanmak büyük kolaylık sağlar.
Node’lar, XPath’in sunduğu eksenlerle (axes) birlikte kullanıldığında, çok daha esnek ve güçlü sorgular oluşturmak mümkündür. Örneğin, bir düğümün tüm çocuklarını, ebeveynini veya belirli bir özelliğe sahip olan kardeşlerini seçmek için axes kullanılır. Bu da, belge içinde istenen veriye hızlı ve kesin bir şekilde ulaşmayı sağlar.
Attribute
Attribute, yani öznitelik, bir XML veya HTML etiketine ek bilgi eklemek için kullanılan yapıdır. Öznitelikler, genellikle bir etiketin davranışını, stilini veya kimliğini tanımlamak için kullanılır. Örneğin, <div class=”header” id=”main-header”> ifadesinde, class ve id birer özniteliktir. Her öznitelik, bir isim ve bir değerden oluşur. Bu yapı, etiketlere esneklik ve anlam kazandırır.
XPath’te attribute seçimi, veri çekme ve filtreleme işlemlerinde sıkça kullanılır. Bir etikete ait belirli bir özniteliği seçmek için @ sembolü kullanılır. Örneğin, tüm class özniteliklerini seçmek için //@class ifadesi kullanılır. Belirli bir öznitelik değerine sahip olan öğeleri seçmek için ise, örneğin //div[@class=’header’] yazılır. Bu ifade, class özniteliği “header” olan tüm div etiketlerini seçer.
Öznitelikler, özellikle web scraping ve test otomasyonu gibi alanlarda büyük önem taşır. Çünkü birçok web sayfasında, öğeleri benzersiz şekilde tanımlamak için öznitelikler kullanılır. Bir butonun, bir form alanının veya bir menü öğesinin seçilmesinde, genellikle id veya class öznitelikleri referans alınır. XPath ile, bu özniteliklere göre seçim yapmak mümkündür.
Attribute kavramı, sadece seçim yapmak için değil, aynı zamanda filtreleme ve koşullu sorgular oluşturmak için de kullanılır. Örneğin, belirli bir öznitelik değerine sahip olan öğeleri seçmek, ya da bir öznitelik değeri belirli bir metni içeriyorsa bu öğeleri bulmak için contains() fonksiyonu kullanılabilir: //a[contains(@href, ‘kategori’)] gibi.
Öznitelikler, belge içinde veri taşımak ve öğeleri tanımlamak için vazgeçilmezdir. XPath’in attribute seçme ve filtreleme yetenekleri, veri çekme işlemlerini hem esnek hem de güçlü hale getirir. Özellikle dinamik ve karmaşık yapılı web sitelerinde, doğru özniteliği seçmek, istenen veriye ulaşmanın anahtarıdır.
Parent
Parent, yani ebeveyn, bir XML veya HTML belgesinde bir düğümün doğrudan üstünde yer alan düğümü ifade eder. Hiyerarşik yapıda, her düğümün bir ebeveyni olabilir. Örneğin, bir <li> etiketi bir <ul> etiketi içinde yer alıyorsa, <ul> etiketi <li> etiketinin ebeveynidir. XPath’te parent kavramı, belge içinde yukarı doğru gezinmek ve bir düğümün üstündeki yapıyı analiz etmek için kullanılır.
Parent seçimi, özellikle belirli bir öğenin hangi yapı içinde yer aldığını anlamak için önemlidir. XPath’te bir düğümün ebeveynini seçmek için parent:: ekseni kullanılır. Örneğin, bir <span> etiketinin ebeveynini seçmek için //span/parent::* ifadesi kullanılabilir. Bu ifade, tüm span etiketlerinin ebeveynlerini seçer. Daha spesifik bir seçim yapmak için, örneğin sadece div ebeveynleri seçmek için //span/parent::div yazılabilir.
Parent kavramı, özellikle karmaşık ve iç içe geçmiş belgelerde, doğru veri çekmek için büyük kolaylık sağlar. Bir öğenin hangi yapı içinde yer aldığını bilmek, hem veri çekme hem de otomasyon işlemlerinde hata riskini azaltır. Özellikle dinamik web sitelerinde, bir öğenin konumu değişse bile, ebeveyn ilişkisi üzerinden doğru seçimler yapmak mümkündür.
Parent seçimi, sadece yukarı doğru gezinmek için değil, aynı zamanda koşullu sorgular oluşturmak için de kullanılır. Örneğin, belirli bir özelliğe sahip olan ebeveynin altındaki öğeleri seçmek için, parent ve child kavramları birlikte kullanılabilir. Bu da, belge içinde çok daha esnek ve güçlü sorgular oluşturmayı sağlar.
Parent kavramı, XPath’in sunduğu eksenlerle birleştiğinde, belge içinde yukarı ve aşağı doğru rahatça gezinmeyi mümkün kılar. Bu sayede, hem veri çekme işlemleri hem de otomasyon senaryoları daha esnek ve dayanıklı hale gelir.
Child
Child, yani çocuk, bir XML veya HTML belgesinde bir düğümün doğrudan altında yer alan düğümleri ifade eder. Hiyerarşik yapıda, her ebeveyn düğümün bir veya birden fazla çocuğu olabilir. Örneğin, bir <ul> etiketi içinde yer alan <li> etiketleri, ul etiketinin çocuklarıdır. XPath’te child kavramı, belge içinde aşağı doğru gezinmek ve belirli bir ebeveynin altındaki öğeleri seçmek için kullanılır.
Child seçimi, veri çekme ve otomasyon işlemlerinde sıkça başvurulan bir yöntemdir. XPath’te bir düğümün çocuklarını seçmek için child:: ekseni kullanılır. Örneğin, bir div etiketinin tüm çocuklarını seçmek için //div/child::* ifadesi kullanılabilir. Daha spesifik bir seçim yapmak için, örneğin sadece p etiketlerini seçmek için //div/child::p yazılabilir.
Child kavramı, özellikle büyük ve karmaşık belgelerde, belirli bir yapının altındaki öğeleri hızlıca bulmak için büyük kolaylık sağlar. Bir menüdeki tüm alt başlıkları, bir tablodaki tüm satırları veya bir formun içindeki tüm alanları seçmek için child ilişkisi kullanılır. Bu, hem veri çekme işlemlerini hızlandırır hem de kodun okunabilirliğini artırır.
Child seçimi, sadece doğrudan alt öğeleri seçmek için değil, aynı zamanda koşullu sorgular oluşturmak için de kullanılır. Örneğin, belirli bir özelliğe sahip olan çocukları seçmek için, child ve attribute kavramları birlikte kullanılabilir: //div/child::p[@class=’alt-baslik’] gibi. Bu ifade, class özniteliği “alt-baslik” olan tüm p etiketlerini seçer.
Child kavramı, XPath’in sunduğu eksenlerle birleştiğinde, belge içinde aşağı doğru esnek ve güçlü sorgular oluşturmayı mümkün kılar. Bu sayede, hem veri çekme hem de otomasyon işlemleri daha pratik ve etkili hale gelir. Özellikle dinamik ve sık değişen web sitelerinde, child ilişkisi üzerinden doğru ve dayanıklı seçimler yapmak mümkündür.