如何使用 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);
}
由于我的 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);
}