استخراج Xquery بين علامتين
-
29-09-2019 - |
سؤال
أنا أعمل حاليًا على استخراج البيانات من HTML
. أود استخراج النص بين اثنين <p class="xfHeading">
العلامات.
<p class="xfHeading"><b>XYZ:</b></p>
<p>asdfghjk</p>
<p>sdsdsd</p>
<p>asdvcvcfghjk</p>
<p class="xfHeading"><b>ABC:</b></p>
<P>fvgbhnjm</P>
<p class="xfHeading"><b>PQR:</b></p>
<ul>
</ul>
<p class="xfHeading"><b>MNO:</b></p>
<ul>
<li>jdjshdj</li>
</ul>
ال انتاج يجب ان يكون :
ASDFGHJK
SDSDSD
ASDVCVCFGHJK
طريقة واحدة للقيام بذلك هي:
/p[class="xfHeading"]/following-sibling::p[0]|/p[class="xfHeading"]/following-sibling::p[1]|/p[class="xfHeading"]/following-sibling::p[2]
أو
/p[class="xfHeading"]/following-sibling::p[position()<4]
ومع ذلك ، نظرًا لأن المحتوى الذي يستمر في التغيير طوال الوقت ، فأنا بحاجة إلى حل يكون فيه المحتوى بين العلامات <p class="xfHeading">
يتم استخلاصه.
المحلول
يستخدم:
(//p[@class="xfHeading"])[1]
/following-sibling::p
[. << (//p[@class="xfHeading"])[2]]
/text()
هذا يعنى: حدد أطفال النصين من الجميع p
العناصر التي تتبع الأشقاء من الأول p
عنصر في المستند مع class
السمة وجود قيمة xfHeading
, ، وفي الوقت نفسه يسبق الثانية p
عنصر في المستند مع class
السمة وجود قيمة xfHeading
.
نصائح أخرى
تعديل: بعد التوضيح الخاص بك ، اقتراحي هو استخدام أ flwor التعبير مثل ما يلي. هذا يبحث عن <p>
مع الصحيح <b>
محتويات العلامة بناءً على المحتويات الفريدة لذلك <b>
علامة ، وإرجاع نص كل <p>
العلامة التي هي أخا منه.
for $b in //p[class="xfHeading"]/b and $p in //p[class="xfHeading"]/p
where $b/text() = "XYZ:"
return p/text()
نلاحظ أن //
هو بنية XPath ، وليس تعليق
إجابة قديمة: بدون مثال على ما تريد أن تبدو عليه البيانات الناتجة ، فإن الإجابة على السؤال صعب بعض الشيء. ومع ذلك ، لتحديد ، على سبيل المثال ، النص داخل أ <b>
العلامة ، ستفعل:
/p[class = "xfHeading"]/b/text()
بشكل عام ، إلحاق text()
إلى نهاية التعبير إرجاع النص داخل العقدة المعنية.