এক্সপথ ব্যবহার করে কীভাবে নিম্নলিখিত ভাইবোন / এক্সএমএল ট্যাগ নির্বাচন করবেন


103

আমার একটি এইচটিএমএল ফাইল রয়েছে (নেওয়েগ থেকে) এবং তাদের এইচটিএমএল নীচের মত সংগঠিত। তাদের নির্দিষ্টকরণের টেবিলে সব ডেটা 'হল নিম্নক্রমে ' যখন প্রতিটি বিভাগে শিরোনাম 'থেকে হয় নাম। নীচে নেয়েগ পৃষ্ঠাগুলি থেকে প্রাপ্ত তথ্যের দুটি উদাহরণ রয়েছে।

<tr>
    <td class="name">Brand</td>
    <td class="desc">Intel</td>
</tr>
<tr>
    <td class="name">Series</td>
    <td class="desc">Core i5</td>
</tr>
<tr>
    <td class="name">Cores</td>
    <td class="desc">4</td>
</tr>
<tr>
    <td class="name">Socket</td>
    <td class="desc">LGA 1156</td>

<tr>
    <td class="name">Brand</td>
    <td class="desc">AMD</td>
</tr>
<tr>
    <td class="name">Series</td>
    <td class="desc">Phenom II X4</td>
</tr>
<tr>
    <td class="name">Cores</td>
    <td class="desc">4</td>
</tr>
<tr>
    <td class="name">Socket</td>
    <td class="desc">Socket AM3</td>
</tr>

শেষ পর্যন্ত আমি একটি সিপিইউ (যা ইতিমধ্যে সেট আপ করা হয়েছে) এর জন্য একটি ক্লাস রাখতে চাই যা প্রতিটি ব্র্যান্ড, সিরিজ, কোর এবং সকেট টাইপের সমন্বয়ে প্রতিটি তথ্য সংরক্ষণ করে। এটি করার বিষয়ে আমি ভাবতে পারি এই একমাত্র উপায়:

if(parsedDocument.xpath(tr/td[@class="name"])=='Brand'):
    CPU.brand = parsedDocument.xpath(tr/td[@class="name"]/nextsibling?).text

এবং বাকি মানগুলির জন্য এটি করছেন। আমি কীভাবে নেক্সটিসিলিংটি সম্পন্ন করব এবং এটি করার সহজ উপায় আছে?

উত্তর:


210

আমি কীভাবে নেক্সটিসিলিংটি সম্পন্ন করব এবং এটি করার সহজ উপায় আছে?

আপনি ব্যবহার করতে পারেন :

tr/td[@class='name']/following-sibling::td

তবে আমি বরং সরাসরি ব্যবহার করব :

tr[td[@class='name'] ='Brand']/td[@class='desc']

এটি ধরে নেয় যে :

  1. প্রসঙ্গ নোড, যার বিরুদ্ধে এক্সপাথের এক্সপ্রেশনটি মূল্যায়ন করা হয় তা হ'ল সমস্ত trউপাদানগুলির পিতা-মাতা আপনার প্রশ্নে দেখানো হয়নি।

  2. প্রতিটি trউপাদান শুধুমাত্র এক হয়েছে tdসঙ্গে classমূল্যবান অ্যাট্রিবিউট 'name'এবং শুধুমাত্র এক tdসঙ্গে classঅ্যাট্রিবিউট মূল্যবান 'desc'


নোট করুন যে আপনি ক্লাস ব্যবহার সম্পর্কে যত্নবান হতে হবে। যখন আপনার 'নাম' শ্রেণীর উপাদানগুলির একই সময়ে অন্য কোনও শ্রেণি থাকে, তখন td[@class='name']ভেঙে যায়। বিস্তারিত জানতে এই প্রশ্নটি দেখুন ।
gm2008

@ gm2008, 'হ্যাঁ, ক্ষেত্রে @class গুণাবলীর মান একাধিক শ্রেণী আছে, ব্যবহারের সম্পৃক্ত হল: contains(concat(' ', @class, ' '), ' name ') । তবে এই প্রশ্নে @ ক্লাসের বৈশিষ্ট্যগুলির কেবলমাত্র একক মান রয়েছে।
দিমিত্রে নোভাচাভেভ

একটি উপাদান সম্পর্কিত:./following-sibling::td
জন Gietzen

4
@ জনগিয়েটজেন, পুনরায়: "কোনও উপাদানের সাথে সম্পর্কিত" - আপনার অর্থ যদি প্রসঙ্গ নোড হয় তবে আমাদের আগ্রহী উপাদানটি this এক্ষেত্রে আপনি বাদ দিতে পারেন ./। এছাড়াও, আপনি যদি অবিলম্বে নিম্নলিখিত ভাইবোন নির্বাচন করতে চান তবে ব্যবহার করুন: following-sibling::td[1]অন্যথায়, যদি নিম্নলিখিত একাধিক ভাইবোন থাকে তবে সমস্তই নির্বাচিত হবে।
দিমিত্রে নোভাচেভ

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