Xpath kullanarak aşağıdaki kardeş / xml etiketi nasıl seçilir


102

Bir HTML dosyam var (Newegg'den) ve HTML'leri aşağıdaki gibi organize edilmiş. Spesifikasyon tablosundaki tüm veriler ' desc ' iken her bölümün başlıkları ' ad ' içindedir. Aşağıda Newegg sayfalarından alınan iki veri örneği bulunmaktadır.

<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>

Sonunda, her bir veriyi depolamak için bir Marka, Seri, Çekirdek ve Soket tipinden oluşan bir CPU için (zaten ayarlanmış olan) bir sınıfa sahip olmak istiyorum. Bunu yapmanın tek yolu bu:

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

Ve bunu değerlerin geri kalanı için yapmak. Nextsibling'i nasıl başarabilirim ve bunu yapmanın daha kolay bir yolu var mı?

Yanıtlar:


205

Nextsibling'i nasıl başarabilirim ve bunu yapmanın daha kolay bir yolu var mı?

Şunları kullanabilirsiniz :

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

ancak doğrudan kullanmayı tercih ederim :

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

Bu varsayar :

  1. XPath ifadesinin değerlendirildiği bağlam düğümü, tüm tröğelerin ebeveynidir - sorunuzda gösterilmez.

  2. Her treleman sadece birine sahip tdolan classdeğerli öznitelik 'name've sadece bir tdile classdeğerli öznitelik 'desc'.


Sınıfı kullanırken dikkatli olmanız gerektiğini unutmayın. "Ad" sınıfınız aynı anda başka bir sınıfa sahip olduğunda td[@class='name'], kırılacaktır. Ayrıntılar için bu soruya bakın.
gm2008

@ gm2008, Evet, @class özelliğinin değeri birden fazla sınıf vardır durumunda, kullanımına yüklem geçerli: contains(concat(' ', @class, ' '), ' name ') . Ancak bu soruda @class özniteliklerinin yalnızca tek değerleri vardır.
Dimitre Novatchev

Bir öğeye göre:./following-sibling::td
John Gietzen

2
@JohnGietzen, Re: "Bir öğeye göre" - Eğer bağlam düğümü ilgilendiğimiz öğe ise demek istiyorsun. Bu durumda atlayabilirsin ./. Ayrıca, hemen sonraki kardeşi seçmek istiyorsanız, şunu kullanın: following-sibling::td[1]aksi takdirde, birden fazla takip eden kardeş varsa, tümü seçilecektir.
Dimitre Novatchev

12

following-siblingEkseni deneyin ( following-sibling::td).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.