Как получить данные с веб-сайта, используя LibreOffice's Calc? - PullRequest
0 голосов
/ 19 мая 2018

Я ищу способ получить некоторые данные с веб-сайта, используя Calc LibreOffice.

Я использовал Google Sheets с функцией IMPORTXML раньше, но, поскольку это очень ненадежно, я хочу использовать Calc вместо этого.

Мои функции там выглядели так:

= IMPORTXML (E2; "// h3 [@ class = 'product-name']")

=IMPORTXML (E2; "// span [@ class = 'price']")

Как вы уже можете догадаться, URL был в E2 (например, 1013 *http://www.killis.at/gin/monkey-47-gin-distiller-s-cut-2016-0-5-lt.html).

InCalc Я пытался =FILTERXML(WEBSERVICE(E2);"//h3[@class='product-name']") только для получения #VALUE!.

Моя версия LibreOffice - 6.0.4.2 с немецким языком. Я использую английские имена функций с ";" в качестве разделителя.

Так что же будет эквивалентно этой функции в Calc и как будет выглядеть соответствующая команда для названия продукта и цены?

Заранее большое спасибо!

1 Ответ

0 голосов
/ 21 мая 2018

Проблема заключается в том, что, хотя 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 ряда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...