حدد كافة الروابط من جدول Html باستخدام XPath (وHtmlAgilityPack)

StackOverflow https://stackoverflow.com/questions/2484985

  •  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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top