এক্সপ্যাথ সহ আমি কীভাবে সিএসএস শ্রেণিতে একটি উপাদান খুঁজে পেতে পারি?


296

আমার ওয়েবপৃষ্ঠায় divএকটি classনামযুক্ত আছে Test

আমি এটি দিয়ে কীভাবে খুঁজে পাব XPath?



এক্সপ্যাথ, সিএসএস, ডিওএম এবং সেলেনিয়াম সলিউশন সম্পর্কিত আরও সাধারণ সম্পর্কিত ডকুমেন্ট এক্সপথ, সিএসএস, ডিওএম এবং সেলেনিয়াম: দ্য রোসেটা স্টোন পাওয়া যাবে । বিশেষত, আপনার উত্তর আইডি এবং নাম আইটেম পাওয়া যাবে ।
টেরেন্স জেই

উত্তর:


472

এই নির্বাচকের কাজ করা উচিত তবে আপনি যদি এটি আপনার উপযুক্ত মার্কআপের সাথে প্রতিস্থাপন করেন তবে আরও দক্ষ হবে:

//*[contains(@class, 'Test')]

বা, যেহেতু আমরা জানি যে অনুসন্ধান করা উপাদানটি হ'ল div:

//div[contains(@class, 'Test')]

তবে যেহেতু এটি যেমন class="Testvalue"বা class="newTest"কমেন্টের সাথে মিলিত হবে @ তোমালকের সংস্করণটি আরও ভাল :

//div[contains(concat(' ', @class, ' '), ' Test ')]

যদি আপনি সত্যই নিশ্চিত হয়ে ওঠেন যে এটি সঠিকভাবে মেলে তবে আপনি ক্লাসের নাম (@ টেরির দ্বারা উল্লিখিত) হিসাবে চারপাশে বিপথগামী হোয়াইটস্পেস অক্ষরগুলি পরিষ্কার করার জন্য নরমালাইজ-স্পেস ফাংশনটিও ব্যবহার করতে পারেন:

//div[contains(concat(' ', normalize-space(@class), ' '), ' Test ')]

নোট করুন যে এই সমস্ত সংস্করণে, আপনি যে শর্তের সাথে মিল রাখতে চান সেই নামটির দ্বারা * সেরাটি প্রতিস্থাপন করা উচিত, যদি না আপনি প্রদত্ত শর্তটির জন্য নথিতে প্রতিটি উপাদান অনুসন্ধান করতে চান।


37
@ মিডার: আরও পছন্দ //div[contains(concat(' ', @class, ' '), ' Test ')]- আপনারাও আংশিক ম্যাচগুলি চালু করবেন।
টমলাক

5
কেন আপনি শুধু // ডিভ [@ ক্লাস = 'টেস্ট'] করবেন না
জেসিকা

11
কারণ ক্লাসগুলির একাধিক মান থাকতে পারে
মধ্যস্বত্বভোগী ওমরালিয়েভ

8
আমি অবাক হয়েছি এক্সপ্যাথের কাছে স্পেস-বিভাজিত টোকেন তালিকায় একটি টোকেন সনাক্ত করার শর্টকাট / আরও দক্ষ উপায় নেই। এক্সপথের পরবর্তী সংস্করণগুলিতে কিছু আছে?
থোমাসরুটটার

1
@ থোমাস্ট্রটার কেন আশ্চর্য - এটি কেবলমাত্র এক্সএমএল এর জন্য তৈরি একটি ভাষা, আরও নির্দিষ্ট এইচটিএমএল নয়, এবং কে এটি এক্সএমএলে কোনও নোড মান হিসাবে স্পেস-বিভাজিত তালিকা ব্যবহার করা নৈমিত্তিক বলে বলতে পারেন। তোমালকের সমাধান খুব কার্যকর।
বিটুলিয়ান

152

সবচেয়ে সহজ উপায় ..

//div[@class="Test"]

ধরে নিয়েছি আপনি <div class="Test">বর্ণিত হিসাবে সন্ধান করতে চান ।


3
উপরের সিনট্যাক্সটি ব্যবহার করা অনেক সহজ এবং ত্রুটি-প্রবণতাও কম। মনে রাখবেন আপনার কাছে অনুসন্ধানের জন্য ক্লাসের চারদিকে ডাবল মূল্য থাকা দরকার। আমি উপরে তালিকাভুক্ত ব্যবহার করার সুপারিশ করব। //
ডিভ

ডিভ [ক্লাস = 'টেস্ট'] আরও গভীর স্তরে থাকা কেসগুলির জন্য এটি কি কাজ করে?
জেক0x32

1
@ জ্যাক0x32, এটি //কেবলমাত্র ব্যবহার করে না বলেই /
সলোমন উকো

7
এটি কি match <ডি ক্লাস = "কিছু-অন্য শ্রেণীর পরীক্ষা করুন"> এর সাথেও মেলে?
জুগল ঠাক্কর

11
@ জুগলঠাকর না, এটি হয় না। এটি কাজ করতে একটি সঠিক মিল প্রয়োজন তবে আপনি তার পরিবর্তে // ডিভ [অন্তর্ভুক্ত (@ ক্লাস, "টেস্ট")] চেষ্টা করতে পারেন।
ওলি পুলজুলা

29

কেবলমাত্র সঠিক ভাবে জন্য XPath সঙ্গে এটা করতে:

//div[contains(concat(" ", normalize-space(@class), " "), " Test ")]

ফাংশনটি normalize-spaceহোয়াইটস্পেসের শীর্ষস্থানীয় এবং অনুসরণযোগ্য স্ট্রিপগুলি সজ্জিত করে এবং হোয়াইটস্পেসের অক্ষরের ক্রমগুলি একটি একক স্থান দ্বারা প্রতিস্থাপন করে।


বিঃদ্রঃ

যদি এই এক্সপথ প্রশ্নের অনেকগুলি প্রয়োজন না হয় তবে আপনি এমন একটি লাইব্রেরি ব্যবহার করতে পারেন যা সিএসএস নির্বাচকদের এক্সপথে রূপান্তর করে, কারণ সিএসএস নির্বাচকরা সাধারণত এক্সপথ অনুসন্ধানগুলির চেয়ে পড়া এবং লেখার পক্ষে উভয়ই অনেক সহজ। উদাহরণস্বরূপ, এই ক্ষেত্রে, আপনি উভয় ব্যবহার করতে div[class~="Test"]এবং div.Testএকই ফলাফল পেতে পারেন ।

কিছু গ্রন্থাগার আমি খুঁজে পেতে সক্ষম হয়েছি:


24

আমি কেবল এটি একটি উত্তর হিসাবে সরবরাহ করছি, যেমন টমালক দীর্ঘকাল আগে মধ্যস্বত্বের উত্তরটির জন্য একটি মন্তব্য হিসাবে সরবরাহ করেছিল

//div[contains(concat(' ', @class, ' '), ' Test ')]

3
দুঃখিত, এইরকম একটি সময় আগে থেকে এনে concat(' ', normalize-space(@class), ' ')দেওয়ার জন্য তবে সমস্ত ধরণের সাদা-স্পেস অক্ষরগুলির জন্য অ্যাকাউন্ট কী ?
টেরি

কৌতূহলের স্বার্থে - //div[contains(concat(' ', @class, ' '), ' Test ')]/chidবাচ্চাদের বাছাই করে না কেন ?
ফিউশন

@ ফিউশন আপনি যদি প্রশ্ন হিসাবে পোস্ট করেন তবে আপনি একটি উত্তর পেতে পারেন।
বিটুলিয়ান

@ বিটুলিয়ান ক্যাপ্টেন সিবিউয়ার হচ্ছেন আজকাল শক্ত
ফিউশন

@ ফিউশন আমি কেবল সাহায্য করার চেষ্টা করছিলাম। এক্সপথ কোনও HTML-সচেতন ভাষা নয়। এটি আরও জেনেরিক, এক্সএমএল-কেবল। আমার এতে কোনও অভিজ্ঞতা নেই তবে আমি মনে করি আপনি ধরে নিচ্ছেন আপনি ট্যাগের পরিবর্তে আইডি রাখতে পারেন। আপনাকে "আইডি" বৈশিষ্ট্যের মান নির্বাচন করতে হবে। সুতরাং আপনাকে এইচটিএমএল নথিটি এক্সএমএল হিসাবে ভাবতে হবে। অফ-টপিক আলোচনা লোকেরা যদিও সমাধান খুঁজে পেতে সহায়তা করে না।
বিটুলিয়ান

1

পূর্ববর্তী উত্তরগুলির বাইরে একটি সহায়ক ফাংশন তৈরি করা যেতে পারে:

function matchClass($className) {
    return "[contains(concat(' ', normalize-space(@class), ' '), ' $className ')]";
}

তারপরে আপনার ক্যোয়ারীতে ফাংশন কলটি সন্নিবিষ্ট করুন।


এই কোডটি কেবল পিএইচপি-তে কাজ করবে। আপনি এটি উল্লেখ করতে পারে।
বিটুলিয়ান

0

শ্বেতক্ষেত্র রয়েছে এমন এক শ্রেণির বিরুদ্ধে ম্যাচ ।

<div class="hello "></div>
//div[normalize-space(@class)="hello"]

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.