Страницы: 1
RSS
Извлечение нужного тега из HTML документа через текстовую переменную (VBA)
 
Добрый день
есть условный HTML документ (см. файл с примером).
Обычный способ извлечения работает на ура.
Суть в том, что нужное дерево тегов формируется каждый раз заново и существует в виде текстовой переменной.
Как можно подружить текст и необходимость извлечь данные? То есть заставить Excel воспринимать текст как код?
Робкая попытка использовать Evaluate() не прошла.
Буду признателен за подсказку.
С уважением,
Slaffka
 
Evaluate() - это для функций листа.

https://stackoverflow.com/questions/43216390/how-to-run-a-string-as-a-command-in-vba
 
Доброе время суток.
Файл не смотрел. Как вариант, если правильно понял
Цитата
Slaffka написал:
Как можно подружить текст и необходимость извлечь данные? То есть заставить Excel воспринимать текст как код?
Код
Public Sub test()
    Dim sHtml As String, pDoc As Object
    Dim pTag As Object, p As Object
    Set pDoc = CreateObject("HTMLFile")
    sHtml = "<html><head><title>Привет</title></head><body><p>Это параграф</p></body></html>"
    pDoc.body.innerHTML = sHtml
    Set pTag = pDoc.GetElementsByTagName("p")
    Debug.Print pTag(0).innerText
End Sub

P. S. Непонятно сама идея. Условный innerHtml собирается кодом VBA, а затем преобразуется в объект HTMLDocument для поиска тегов, а зачем такой огород? Или что-то не понимаю?
 
Цитата
Андрей VG написал:
Файл не смотрел.
В примере все должно быть понятно.
 
Цитата
Slaffka написал:
В примере все должно быть понятно.
А чего бы сразу не написать правильно? Вместо вводящего в заблуждения
Цитата
Slaffka написал:
есть условный HTML документ
В ячейке находится фрагмент HTML документа
Код
Public Sub test()
    Dim sHtml As String, pTag As Object
    Dim pDoc As New MSHTML.HTMLDocument
    sHtml = ActiveSheet.Range("A1").Value
    pDoc.body.innerHTML = sHtml
    Set pTag = pDoc.querySelector("TABLE.ViewTable1")
    If Not pTag Is Nothing Then Debug.Print pTag.innerText
End Sub
 
Андрей,  вопрос-то не в этом. И вытаскивать содержимое не нужно.

В примере нужная информация описана как путь:
doc.getElementsByClassName("ViewTable1")(0).getElementsByTagName("b")(0).innerText

вопрос в том, можно ли загнать путь в текстовую переменную, и использовать ее как указание откуда брать данные.

переменная генерится в процессе исполнения скрипта, то есть может принять вид и такой, и например вот такой:

doc.getElementsByClassName("deemphasize")(2).getElementsByTagName("span")(10).innerHTML (для приведенного примера вернет ошибку, конечно)

Это будет текст, по которому скрипт должен пойти и получить данные.
Собственно вопрос в том, как заставить принять текст как команду.

Так не вводит в заблуждение?

querySelector штука занятная, но я не вижу пока как его применить по моей теме. Может он обращаться ко вложенным тегам? И брать не первый по порядку а с нужным номером?
 
Цитата
serega124 написал:
Evaluate() - это для функций листа. https://stackoverflow.com/questions/43216390/how-to-run-a-string-as-a-command-in-vba

Да, это вариант. Выглядит конечно громоздко, и сколько времени занимает не совсем понятно.
Пасиб, попробую протестировать
 
querySelector применить не всегда получится
зависит от установленной версии IE

поэтому, я остановился на таком способе поиска тегов в HTML:
http://excelvba.ru/code/html
 
Цитата
Игорь написал:
поэтому, я остановился на таком способе поиска тегов в HTML:
Да, я видел в поиске выдачу этой ссылки, когда искал решение. Моя задача существенно скромнее, все в принципе решается через Instr и Mid в применение к тексту документа. Просто делать через getElement иногда выглядит гораздо изящнее, и с циклами проще.
Тут уже принципиальный вопрос, есть ли лазейка чтобы скрипт принял текстовую переменную и выполнил как будто это строка кода.
Пока только решение из первого ответа, програмное создание нового модуля с заданным текстом, вызов и удаление потом.

В любом случае всем спасибо и всех с праздником. Если кто набредет на ответ, дайте знать.
 
Цитата
Игорь написал:
querySelector применить не всегда получится, зависит от установленной версии IE
Игорь, спасибо за комментарий. Поковырял. Всё даже хуже. Стоит IE 11, тем не менее querySelector кричит на запрос "div.deemphasize > span:nth-child(1)" - недопустимый аргумент, хотя поддержка для такого определения CSS применяется в IE9+. Похоже MSHTML.HTMLDocument поддерживает только какую-то предопределённую версию CSS, не связанную с версией IE. Короче, забил Microsoft на обновление COM-объектов, используемых в VBA. :(
 
На XPath не смотрели?
 
Цитата
serega124 написал:
На XPath не смотрели?
XPath мощная штука, пусть и точно также не поддерживаемая во всей красе в COM объектах от Microsoft. Но, а как вы будете использовать XPath с таким html?
Скрытый текст

HTML5 принципов XHTML не придерживается, да HTML4 их тоже не очень то и содержал.
 
Цитата
Slaffka написал:
можно ли загнать путь в текстовую переменную, и использовать ее как указание откуда брать данные
Обратиться к свойству или методу объекта, заданному в текстовой переменной, можно с помощью функции CallByName.
 
Если в этом коде:
Код
Public Sub test()
    Dim sHtml As String, pDoc As Object
    Dim pTag As Object, p As Object
    Set pDoc = CreateObject("HTMLFile")
    sHtml = "<html><head><title>Привет</title></head><body><p>Это параграф</p></body></html>"
    pDoc.body.innerHTML = sHtml
    Set pTag = pDoc.GetElementsByTagName("p")
    Debug.Print pTag(0).innerText
End Sub

заменить:
Код
sHtml = "<html><head><title>Привет</title></head><body><p>Это параграф</p></body></html>"

на:
Код
sHtml = "<html><head><title>Привет</title></head><body><p class=""black"">Это параграф</p></body></html>"

то как искать по class="black"???
Изменено: tchack - 03.10.2023 16:02:51
 
Код
Set pTag = pDoc.getElementsByClassName("black")
 
nilske, если так написать, то будет ошибка "Object doesn't support this property or method".
 
tchack, здесь не подскажу - у меня всё работает без ошибок.
Страницы: 1
Наверх