@@ -725,6 +725,30 @@ function scrapableHeuristics(maxCountPerPage = 50, minArea = 20000, scrolls = 3,
725725 } ) ;
726726 }
727727
728+ function tryFallbackSelector ( rootElement , originalSelector ) {
729+ let element = queryElement ( rootElement , originalSelector ) ;
730+
731+ if ( ! element && originalSelector . includes ( 'nth-child' ) ) {
732+ const match = originalSelector . match ( / n t h - c h i l d \( ( \d + ) \) / ) ;
733+ if ( match ) {
734+ const position = parseInt ( match [ 1 ] , 10 ) ;
735+
736+ for ( let i = position - 1 ; i >= 1 ; i -- ) {
737+ const fallbackSelector = originalSelector . replace ( / n t h - c h i l d \( \d + \) / , `nth-child(${ i } )` ) ;
738+ element = queryElement ( rootElement , fallbackSelector ) ;
739+ if ( element ) break ;
740+ }
741+
742+ if ( ! element ) {
743+ const baseSelector = originalSelector . replace ( / \: n t h - c h i l d \( \d + \) / , '' ) ;
744+ element = queryElement ( rootElement , baseSelector ) ;
745+ }
746+ }
747+ }
748+
749+ return element ;
750+ }
751+
728752 // Main scraping logic with context support
729753 let containers = queryElementAll ( document , listSelector ) ;
730754 containers = Array . from ( containers ) ;
@@ -902,7 +926,7 @@ function scrapableHeuristics(maxCountPerPage = 50, minArea = 20000, scrolls = 3,
902926 for ( const [ label , { selector, attribute } ] of Object . entries ( nonTableFields ) ) {
903927 // Get the last part of the selector after any context delimiter
904928 const relativeSelector = selector . split ( / (?: > > | : > > ) / ) . slice ( - 1 ) [ 0 ] ;
905- const element = queryElement ( container , relativeSelector ) ;
929+ const element = tryFallbackSelector ( container , relativeSelector ) ;
906930
907931 if ( element ) {
908932 record [ label ] = extractValue ( element , attribute ) ;
0 commit comments