extractOpenGraph method
Extracts Open Graph data from HTML
Implementation
List<StructuredDataExtractionResult> extractOpenGraph(String html) {
final document = html_parser.parse(html);
final results = <StructuredDataExtractionResult>[];
try {
// Find all meta tags with property starting with "og:"
final metaTags = document.querySelectorAll('meta[property^="og:"]');
if (metaTags.isEmpty) {
return results;
}
final data = <String, dynamic>{};
for (final metaTag in metaTags) {
final property = metaTag.attributes['property'];
final content = metaTag.attributes['content'];
if (property != null && content != null) {
// Remove the "og:" prefix
final key = property.substring(3);
// Handle arrays (e.g., og:image, og:image:width, og:image:height)
if (key.contains(':')) {
final parts = key.split(':');
final mainKey = parts[0];
final subKey = parts.sublist(1).join(':');
if (!data.containsKey(mainKey)) {
data[mainKey] = <String, dynamic>{};
} else if (data[mainKey] is! Map) {
// If it's already a string, convert to a map with 'url' key
data[mainKey] = {'url': data[mainKey]};
}
if (data[mainKey] is Map) {
(data[mainKey] as Map<String, dynamic>)[subKey] = content;
}
} else {
data[key] = content;
}
}
}
if (data.isNotEmpty) {
// Add type information
data['@type'] = 'OpenGraph';
results.add(
StructuredDataExtractionResult(
type: StructuredDataType.openGraph,
data: data,
rawData: metaTags.map((e) => e.outerHtml).join('\n'),
),
);
}
logger?.info('Extracted ${results.length} Open Graph items');
} catch (e) {
logger?.error('Error extracting Open Graph data: $e');
}
return results;
}