Проблема заключается в том, что, хотя IMPORTXML утверждает, что может анализировать суп HTML-тега, что не всегда верно, FILTERXML требует действительный поток XML для каждого определения.И тег супа HTML не является допустимым потоком XML.Честно говоря, HTML в основном противоположен действительному потоку XML.
Таким образом, единственный способ - использовать сторонние парсеры тегов или использовать теги HTML в качестве строки и использовать строковые операции для поиска необходимых частей.строки.
Второй подход может выглядеть следующим образом:
Public Function GETFROMHTML(sURL as String, sStartTag as String) as String
on error goto onErrorExit
oSimpleFileAccess = createUNOService ("com.sun.star.ucb.SimpleFileAccess")
oInpDataStream = createUNOService ("com.sun.star.io.TextInputStream")
oInpDataStream.setInputStream(oSimpleFileAccess.openFileRead(sUrl))
dim delimiters() as long
sContent = oInpDataStream.readString(delimiters(), false)
lStartPos = instr(1, sContent, sStartTag )
if lStartPos = 0 then
GETFROMHTML = "tag " & sStartTag & " not found"
exit function
end if
lEndPos = instr(lStartPos, sContent, "</")
lStartPos = lStartPos + 1 + len(sStartTag)
sText = trim(replace(replace(mid(sContent, lStartPos, lEndPos-lStartPos), chr(10), ""), chr(13), ""))
GETFROMHTML = sText
onErrorExit:
on error goto 0
End Function
Используется в ячейках Calc примерно так:
=GETFROMHTML(E2; "<h3 class=""product-name""")
или
=GETFROMHTML(E2; "<span class=""price""")
Использование Sub
может выглядеть следующим образом:
sub getProductNameAndPrice()
on error resume next
oDoc = ThisComponent
oSheet = oDoc.CurrentController.ActiveSheet
for r = 0 to 9 'row 1 to 10 (0 based)
sURL = oSheet.getCellByPosition(4, r).String 'get string value from column 4 (E)
oSimpleFileAccess = createUNOService ("com.sun.star.ucb.SimpleFileAccess")
oInpDataStream = createUNOService ("com.sun.star.io.TextInputStream")
oInpDataStream.setInputStream(oSimpleFileAccess.openFileRead(sUrl))
if not isNull(oInpDataStream.InputStream) then
dim delimiters() as long
sContent = oInpDataStream.readString(delimiters(), false)
sStartTag = "<h3 class=""product-name"""
lStartPos = instr(1, sContent, sStartTag)
if lStartPos <> 0 then
lEndPos = instr(lStartPos, sContent, "</")
lStartPos = lStartPos + 1 + len(sStartTag)
sText = trim(replace(replace(mid(sContent, lStartPos, lEndPos-lStartPos), chr(10), ""), chr(13), ""))
oSheet.getCellByPosition(5, r).String = sText
end if
sStartTag = "<span class=""price"""
lStartPos = instr(1, sContent, sStartTag)
if lStartPos <> 0 then
lEndPos = instr(lStartPos, sContent, "</")
lStartPos = lStartPos + 1 + len(sStartTag)
sText = trim(replace(replace(mid(sContent, lStartPos, lEndPos-lStartPos), chr(10), ""), chr(13), ""))
oSheet.getCellByPosition(6, r).String = sText
end if
end if
next
on error goto 0
end sub
Этот код берет URL-адреса из столбца E
строк с 1 по 10 и записывает название продукта в столбце F
и цену в столбце G
ряда.