วิธีเลือกแท็ก sibling / xml ต่อไปนี้โดยใช้ xpath


103

ฉันมีไฟล์ HTML (จาก Newegg) และ HTML ของพวกเขาถูกจัดระเบียบดังต่อไปนี้ ข้อมูลทั้งหมดในตารางข้อกำหนดคือ ' desc ' ในขณะที่ชื่อของแต่ละส่วนอยู่ใน ' name ด้านล่างนี้คือสองตัวอย่างข้อมูลจากเพจ Newegg

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

ในท้ายที่สุดฉันต้องการมีคลาสสำหรับ CPU (ซึ่งตั้งค่าไว้แล้ว) ที่ประกอบด้วยประเภท Brand, Series, Cores และ Socket เพื่อเก็บข้อมูลแต่ละรายการ นี่เป็นวิธีเดียวที่ฉันคิดได้ว่าจะทำสิ่งนี้:

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. โหนดบริบทซึ่งนิพจน์ XPath ได้รับการประเมินคือพาเรนต์ของtrองค์ประกอบทั้งหมด- ไม่แสดงในคำถามของคุณ

  2. แต่ละtrองค์ประกอบมีเพียงคนเดียวtdที่มีclassคุณลักษณะที่มีมูลค่า'name'และมีเพียงหนึ่งtdกับแอตทริบิวต์มูลค่าclass'desc'


โปรดทราบว่าคุณต้องระมัดระวังในการใช้คลาส เมื่อองค์ประกอบคลาส 'ชื่อ' ของคุณมีคลาสอื่นในเวลาเดียวกันtd[@class='name']จะแตก ดูคำถามนี้เพื่อดูรายละเอียด
gm2008

@ gm2008 ใช่ในกรณีที่มีมากกว่าหนึ่งชั้นในค่าของแอตทริบิวต์ @class contains(concat(' ', @class, ' '), ' name ') ที่กริยาที่จะใช้เป็น: แต่ในคำถามนี้แอตทริบิวต์ @class มีเพียงค่าเดียว
Dimitre Novatchev

สัมพันธ์กับองค์ประกอบ:./following-sibling::td
John Gietzen

2
@JohnGietzen, Re: "Relative to an element" - คุณหมายถึงหากบริบทโหนดเป็นองค์ประกอบที่เราสนใจในกรณีนี้คุณสามารถละเว้น./ได้ นอกจากนี้หากคุณต้องการเลือกพี่น้องต่อไปนี้ให้ใช้: following-sibling::td[1]มิฉะนั้นหากมีพี่น้องที่ติดตามมากกว่าหนึ่งคนจะถูกเลือกทั้งหมด
Dimitre Novatchev

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.