การเลือกโหนดข้อความทั้งหมดในตารางด้วย XPath

นี่คือหน้าจากฐานข้อมูลแบบเปิดเกี่ยวกับอาหาร:

http://www.dabas.com/ProductSheet/Details.ashx/121308

ฉันกำลังพยายามรับข้อมูลบางอย่างจากหน้านี้โดยใช้ XPath ตารางที่ฉันสนใจคือโต๊ะชื่อ: Näringsvärde ฉันต้องการบันทึกโหนดข้อความทั้งหมดภายใน "Näringsvärde" ลงในสตริง

นี่คือส่วนที่เกี่ยวข้องของโค้ดที่ลิงก์ด้านบน:

<!DOCTYPE html>
<html>
...
<body>
...
<table class="width100" style="page-break-inside: avoid">
    <caption>
        Produktinformation
            <img src="../../images/ProductSheet/draw-triangle3.png" id="toggleProduktinformation"
                 class="imgCaptionOn" />
    </caption>
    <tbody id="tbodyProduktinformation">
        <tr>
            <td class="col1">
                Ursprungsland:
            </td>
            <td>
Sverige            </td>
        </tr>
        ...
    </tbody>
</table>

<table id="tableHover" class="width100 marginTop30 bgTable">
<tr class="nohover">

<td class="tdLeft48 padding0">
    <table id="nutritiveTabel" class="leftTable" style="page-break-inside: avoid">
        <caption>
            Näringsvärde
                <img src="../../images/ProductSheet/draw-triangle3.png" id="toggleNutritiveValues"
                    class="imgCaptionOn" />
        </caption>
        <tbody id="tbodyNutritiveValues">
            <tr id="divNutritiveValues">
                <td class="padding">
                    <table class="noBorder width100">
                            <tr>
                                <td class="col1">
                                    Tillagningsstatus:
                                </td>
                                <td>Tillagad</td>
                                <td colspan="2">
                                    &amp;amp;nbsp;
                                </td>
                            </tr>
                        ...
                    </table>
                </td>
            </tr>
        </tbody>
    </table>
</td>
...
</html>

จนถึงตอนนี้ฉันลองใช้อะไรแบบนี้ แต่มันก็ไม่ได้ผล:

public List<string> GetNaring(string xid) {         
    HtmlWeb web = new HtmlWeb();
    HtmlDocument doc = web.Load(xid);
    var xpath = "/html/body/div/div[2]/div[2]/table[2]/tbody/tr/td/table/tbody";
    var links = doc.DocumentNode.SelectNodes(xpath);
    return links.Select(n => n.InnerText).ToList();

}

แต่นี่กลับคืนมาเพียง null ฉันขาดอะไรไป


person user2915962    schedule 25.05.2014    source แหล่งที่มา


คำตอบ (1)


นิพจน์ XPath:

/html/body/div/div[2]/div[2]/table[2]/tbody/tr/td/table/tbody

ไม่ตรงกับโหนดใด ๆ

เนื่องจากคุณมีสายอักขระเฉพาะที่สามารถจับคู่ได้ คุณจึงควรใช้มัน ค้นหาสตริงนั้นในซอร์สโค้ด คุณจะพบ:

...
<td class="tdLeft48 padding0">
    <table id="nutritiveTabel" class="leftTable" style="page-break-inside: avoid">
        <caption>
            Näringsvärde
                <img src="../../images/ProductSheet/draw-triangle3.png" id="toggleNutritiveValues"
                    class="imgCaptionOn" />
        </caption>
        <tbody id="tbodyNutritiveValues">
            <tr id="divNutritiveValues">
...

สตริงเป็นลูกขององค์ประกอบ caption ภายในตารางที่คุณต้องการ คุณต้องได้รับ ค่าสตริง ขององค์ประกอบนั้น ตัดการเว้นวรรคเพิ่มเติม และใช้ผลลัพธ์เพื่อเปรียบเทียบกับ "Näringsvärde" คุณสามารถเลือก table ที่ถูกต้องได้โดยใช้นิพจน์นี้:

//table[normalize-space(caption/text())='Näringsvärde']

เมื่อคุณมีตารางที่ถูกต้องแล้ว คุณสามารถนำทางภายในตารางและเลือกโหนดที่คุณต้องการ หรือคุณสามารถรับ ค่าสตริง ซึ่งเป็นการต่อโหนดข้อความที่สืบทอดทั้งหมดเข้าด้วยกัน:

//table[normalize-space(caption/text())='Näringsvärde']//td

สิ่งนี้จะส่งคืนโหนด td ทั้งหมดซึ่งเป็นตำแหน่งของข้อความ

person helderdarocha    schedule 25.05.2014
comment
ขอบคุณมากสำหรับรหัสและบทเรียน! มันทำงานได้อย่างสมบูรณ์แบบ และฉันจะกลับมาถามคำถามนี้อีกครั้งในครั้งต่อไปอย่างแน่นอน - person user2915962; 25.05.2014
comment
ฉันไม่แน่ใจว่าทำไม แต่รหัสนี้ให้ข้อมูลทั้งหมดกลับมาสองครั้ง .. คุณรู้ไหมว่ามันคืออะไร? อาจมีบางอย่างผิดปกติที่อื่น? - person user2915962; 25.05.2014
comment
หากข้อมูลไม่ซ้ำกันในไฟล์ต้นฉบับ ปัญหาจะไม่อยู่ในนิพจน์ XPath - person helderdarocha; 25.05.2014