Посмотрев на предложение @GUNNM, я кое-что заработал довольно легко, используя библиотеку:
CREATE TEMP FUNCTION parseHTML(html STRING)
RETURNS STRING
LANGUAGE js
OPTIONS (
library=["gs://my-bq-udf/htmlparser.js"]
)
AS
"""
captions = []
elementSelected = false
HTMLParser(html, {
start: function( tag, attrs, unary ) {
if (tag == "div") {
for (var i = 0; i < attrs.length; i++) {
if (attrs[i].name == "class" && attrs[i].value.indexOf("caption") > -1) {
elementSelected = true
return
}
}
}
},
end: function( tag ) {
elementSelected = false
},
chars: function( text ) {
if (elementSelected) {
captions.push(text)
}
},
comment: function( text ) { }
});
return captions.join("|")
"""
Это упрощенный пример, но он показывает, как вы можете загрузить это как внешний UDF и используя обратные вызовы, доступ и различные части структурированного HTML. Я создаю массив div с классом == "заголовок".
Спасибо!