حدد كافة الروابط من جدول Html باستخدام XPath (وHtmlAgilityPack)
-
21-09-2019 - |
سؤال
ما أحاول تحقيقه هو استخراج جميع الروابط باستخدام سمة href التي تبدأ بـ http:// أو https:// أو /.تقع هذه الروابط ضمن جدول (tbody > tr > td إلخ) بفئة معينة.اعتقدت أنه يمكنني تحديد العنصر a فقط دون المسار الكامل إليه ولكن لا يبدو أنه يعمل.أحصل على NullReferenceException في السطر الذي يحدد الروابط:
var table = doc.DocumentNode.SelectSingleNode("//table[@class='containerTable']");
if (table != null)
{
foreach (HtmlNode item in table.SelectNodes("a[starts-with(@href, 'https://')]"))
{
//not working
لا أعرف أي توصيات أو أفضل الممارسات عندما يتعلق الأمر بـ XPath.هل أقوم بإنشاء حمل عندما أقوم بالاستعلام عن المستند مرتين؟
المحلول
يستخدم:
//tbody/descendant::a[starts-with(@href,'https://')
or
starts-with(@href,'http://')
or
starts-with(@href,'./')
]
ستظل لديك مشكلة, ، إلا إذا قمت بتصحيح التعليمات البرمجية الخاصة بك لتعكس حقيقة أن ملف XmlNode.SelectNodes()
طريقة المثيل لها نوع إرجاع XmlNodeList
, ، لا HtmlNode
.
نصائح أخرى
تكمن المشكلة في أنك تقوم بتحديد الجدول ثم تحاول على الفور تحديد نقاط الارتساء كما لو كانت متوفية مباشرة.هناك tr
و td
العلامات في الوسط.
لذا، إذا قمت بتغيير xpath الخاص بك إلى ما يلي، فيجب أن تعمل الأمور:
"tbody/tr/td/a[starts-with(@href, 'https://')]"
لن ينجح هذا إذا كانت المراسي الخاصة بك ملفوفة بشيء آخر، لذا يمكنك الاختيار الجميع من المراسي في مجموعة العقدة الحالية (أي.طاولة):
"//a[starts-with(@href, 'https://')]"
يرى هذا لمزيد من التفاصيل حول بناء جملة xpath.