xpathを使用して次の兄弟/ XMLタグを選択する方法


102

(Neweggからの)HTMLファイルがあり、そのHTMLは以下のように構成されています。仕様表のすべてのデータは「desc」であり、各セクションのタイトルは「名前です。'以下は、Neweggページのデータの2つの例です。

<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(すでに設定されている)のクラスが必要です。これは、これを実行するために私が考えることができる唯一の方法です。

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

そして、残りの値に対してこれを行います。次の兄弟をどのようにして達成しますか?これを行う簡単な方法はありますか?

回答:


205

次の兄弟をどのようにして達成しますか?これを行う簡単な方法はありますか?

以下を使用できます

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

しかし、私はむしろ直接使用したいです:

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

これは、その前提として

  1. XPath式が評価されるコンテキストノードは、すべてのtr要素の親です-質問には示されていません。

  2. tr要素にはtdclass属性値'name'を持つ要素が1つと、属性値を持つ要素が1つだけtdありclassます'desc'


クラスの使用には注意が必要です。「名前」クラス要素に他のクラスが同時に含まれていると、td[@class='name']が壊れます。詳細については、この質問を参照してください。
gm2008

@ gm2008、はい、@ class属性の値に複数のクラスがある場合、使用する述語は次のとおりcontains(concat(' ', @class, ' '), ' name ') です。しかし、この質問では、@ class属性には単一の値しかありません。
Dimitre Novatchev 2015年

要素に対して:./following-sibling::td
John Gietzen

2
@ JohnGietzen、Re:「要素に対して相対的」-つまり、コンテキストノードが対象の要素である場合、省略できます./。また、直後の兄弟を選択する場合は、を使用します。following-sibling::td[1]それ以外の場合、後続の兄弟が複数ある場合は、すべてが選択されます。
Dimitre Novatchev 2016年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.