Cách chọn thẻ anh chị em / xml sau bằng xpath


102

Tôi có một tệp HTML (từ Newegg) và HTML của chúng được tổ chức như bên dưới. Tất cả dữ liệu trong bảng thông số kỹ thuật của chúng là ' desc ' trong khi tiêu đề của mỗi phần là ' name. 'Dưới đây là hai ví dụ về dữ liệu từ các trang 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>

Cuối cùng, tôi muốn có một lớp cho CPU (đã được thiết lập) bao gồm loại Thương hiệu, Dòng, Lõi và Ổ cắm để lưu trữ từng dữ liệu. Đây là cách duy nhất tôi có thể nghĩ ra để làm điều này:

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

Và làm điều này cho các giá trị còn lại. Làm cách nào để thực hiện việc phân loại nextsibling và có cách nào dễ dàng hơn để thực hiện việc này không?

Câu trả lời:


205

Làm cách nào để thực hiện việc phân loại nextsibling và có cách nào dễ dàng hơn để thực hiện việc này không?

Bạn có thể sử dụng :

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

nhưng tôi muốn sử dụng trực tiếp :

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

Điều này giả định rằng :

  1. Nút ngữ cảnh mà biểu thức XPath được đánh giá là nút gốc của tất cả các trphần tử - không được hiển thị trong câu hỏi của bạn.

  2. Mỗi trphần tử có chỉ có một tdvới classthuộc tính có giá trị 'name'và chỉ có một tdvới classthuộc tính có giá trị 'desc'.


Lưu ý rằng bạn phải cẩn thận khi sử dụng class. Khi các phần tử lớp 'tên' của bạn có bất kỳ lớp nào khác đồng thời, td[@class='name']sẽ bị phá vỡ. Xem câu hỏi này để biết chi tiết.
gm2008

@ gm2008, Có, trong trường hợp có nhiều hơn một lớp vào giá trị của thuộc tính @class, vị từ để sử dụng là: contains(concat(' ', @class, ' '), ' name ') . Nhưng trong câu hỏi này, các thuộc tính @class chỉ có các giá trị duy nhất.
Dimitre Novatchev

So với một yếu tố:./following-sibling::td
John Gietzen

2
@JohnGietzen, Re: "Liên quan đến một phần tử" - Ý bạn là Nếu nút ngữ cảnh là phần tử chúng tôi quan tâm. Trong trường hợp này, bạn có thể bỏ qua ./. Ngoài ra, nếu bạn muốn chọn anh chị em ngay sau đây, hãy sử dụng following-sibling::td[1]:, ngược lại, nếu có nhiều hơn một anh chị em sau, tất cả sẽ được chọn.
Dimitre Novatchev

12

Thử following-siblingtrục ( following-sibling::td).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.