如何使用 HTML Agility Pack 首次出现 src

How to get first occurence of src with HTML Agility Pack

由于我的 xml 格式无效,我正在使用 HTML Agility Pack。 例如,我正在解析此提要:https://www.rioseo.com/feed/

我有这些元素的数组(所以“src”总是唯一的):

<content:encoded><![CDATA[<h2><a href="https://resources.rioseo.com/c/gbp-guide-for-hospit?x=0hTW-s"><img class="alignnone size-full wp-image-23086" src="https://www.rioseo.com/wp-content/uploads/2022/04/Rio_eBook_GBP-Guide-for-Hospitality-Brands_April2022_Hero.jpg" alt="" width="1200" height="409" srcset="https://www.rioseo.com/wp-content/uploads/2022/04/Rio_eBook_GBP-Guide-for-Hospitality-Brands_April2022_Hero-200x68.jpg 200w, https://www.rioseo.com/wp-content/uploads/2022/04/Rio_eBook_GBP-Guide-for-Hospitality-Brands_April2022_Hero-300x102.jpg 300w, https://www.rioseo.com/wp-content/uploads/2022/04/Rio_eBook_GBP-Guide-for-Hospitality-Brands_April2022_Hero-400x136.jpg 400w,

我只想从 src 属性中获取图像的第一个 url,因此我的预期输出应该是(url 的数组):

{'https://www.rioseo.com/wp-content/uploads/2022/04/Rio_eBook_GBP-Guide-for-Hospitality-Brands_April2022_Hero.jpg',
https://another.url.extracted.from.the.array.of.'content_encoded'}

我可以从 'content-encoded' 节点输出整个 img 元素:

var images = doc.DocumentNode.SelectNodes(".//*[name()='content:encoded']/img").ToArray();
foreach (var item in images)
     {
          Console.WriteLine("image: " + item.OuterHtml);
     }

除 OuterHtml 之外的其他方法给我空白输出。

我还可以输出这个字符串中的每个 img:

var items = doc.DocumentNode.SelectNodes("//img[@src]").ToArray();
foreach (var image in items)
     {
          Console.WriteLine("img: " + image.Attributes["src"].Value);
     }

我知道我必须从 img 元素中提取第一次出现的“https”。 我已经尝试了很多 xpaths,但我无法得到它。可能我的xpath本身是错误的,但我不知道如何修复它。

非常感谢任何帮助:),谢谢!

您的 content:encoded 示例不完整,但我认为这可能是一个解决方案:

var images = doc.DocumentNode.SelectNodes(".//*[name()='content:encoded']//img")
    .Select(item => item.GetAttributeValue("src", null))
    .Where(item => item != null)
    .ToList();
foreach (var url in images)
{
    Console.WriteLine("image: " + url);
}

XPATH 与您的一样,但由于 CDATA,img 中有两个 //。然后我 select src 属性(如果不存在则为 null)并过滤 null 项目(没有 src 的图像,我想你没有,但这是一个完整性检查)。

我想我明白了,我只是用 RegEx 做到了:

var items = doc.DocumentNode.SelectNodes(".//item").ToArray();
foreach (var item in items)
         {
              string matchString = Regex.Match(item.OuterHtml, "<img.+?src=[\"'](.+?)      [\"'].*?>", RegexOptions.IgnoreCase).Groups[1].Value;
              Console.WriteLine("img: " + matchString);
         }