如何获得第一次出现的src与HTML敏捷包



由于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);
}

我知道我必须提取第一个出现的"https"来自img元素。我尝试了很多路径,但都没有成功。可能我的xpath本身是错误的,但我不知道如何修复它。

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

您的内容:编码样本是不完整的,但我认为这可以是一个解决方案:

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与您的XPATH类似,但是由于CDATA的关系,使用了两个//。然后我选择src属性(或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);
}

最新更新