كيف يمكنك تحليل سلسلة HTML لعلامات الصور للحصول على معلومات SRC؟

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

  •  02-07-2019
  •  | 
  •  

سؤال

حاليًا أستخدم .Net WebBrowser.Document.Images() لفعل هذا.ويتطلب Webrowser لتحميل الوثيقة.إنها فوضوية وتستهلك الموارد.

وفق هذا السؤال XPath أفضل من التعبير العادي في هذا.

هل يعرف أحد كيفية القيام بذلك في C#؟

هل كانت مفيدة؟

المحلول

إذا كانت سلسلة الإدخال الخاصة بك صالحة بتنسيق XHTML، فيمكنك التعامل معها على أنها xml، وتحميلها في مستند xml، وإجراء عملية XPath السحرية :) ولكن الأمر ليس كذلك دائمًا.

وإلا يمكنك تجربة هذه الوظيفة التي ستعيد جميع روابط الصور من HtmlSource:

public List<Uri> FetchLinksFromSource(string htmlSource)
{
    List<Uri> links = new List<Uri>();
    string regexImgSrc = @"<img[^>]*?src\s*=\s*[""']?([^'"" >]+?)[ '""][^>]*?>";
    MatchCollection matchesImgSrc = Regex.Matches(htmlSource, regexImgSrc, RegexOptions.IgnoreCase | RegexOptions.Singleline);
    foreach (Match m in matchesImgSrc)
    {
        string href = m.Groups[1].Value;
        links.Add(new Uri(href));
    }
    return links;
}

ويمكنك استخدامه مثل هذا:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.example.com");
request.Credentials = System.Net.CredentialCache.DefaultCredentials;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK)
{
    using(StreamReader sr = new StreamReader(response.GetResponseStream()))
    {
        List<Uri> links = FetchLinksFromSource(sr.ReadToEnd());
    }
}

نصائح أخرى

المشكلة الكبيرة في أي تحليل لـ HTML هي الجزء "جيد التكوين".لقد رأيت HTML التافه الموجود هناك - ما مقداره الذي تم تصميمه بشكل جيد حقًا؟كنت بحاجة إلى القيام بشيء مماثل - تحليل جميع الروابط الموجودة في المستند (وفي حالتي) وتحديثها برابط مُعاد كتابته.لقد وجدت أتش تي أم أل أجيليتي حزمة على CodePlex.إنه رائع (ويتعامل مع HTML المشوه).

فيما يلي مقتطف للتكرار على الروابط الموجودة في المستند:

HtmlDocument doc = new HtmlDocument();
doc.Load(@"C:\Sample.HTM");
HtmlNodeCollection linkNodes = doc.DocumentNode.SelectNodes("//a/@href");

Content match = null;

// Run only if there are links in the document.
if (linkNodes != null)
{
    foreach (HtmlNode linkNode in linkNodes)
    {
        HtmlAttribute attrib = linkNode.Attributes["href"];
        // Do whatever else you need here
    }
}

مشاركة المدونة الأصلية

إذا كان كل ما تحتاجه هو الصور، فسأستخدم التعبير العادي فقط.شيء مثل هذا يجب أن يفعل الخدعة:

Regex rg = new Regex(@"<img.*?src=""(.*?)""", RegexOptions.IgnoreCase);

إذا كان xhtml صالحًا، فيمكنك القيام بذلك:

XmlDocument doc = new XmlDocument();
doc.LoadXml(html);
XmlNodeList results = doc.SelectNodes("//img/@src");
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top