как выбрать вкладку на веб-странице с помощью парсинга с помощью vba excel - PullRequest
0 голосов
/ 21 июня 2020

я пытаюсь получить данные с этого веб-сайта https://worldwide.espacenet.com/patent/search/family/040428971/publication/EP2429240A1?q=pn%3DEP2429240A1 ссылка открывает домашнюю страницу, но я хочу go перейти на страницу описания.

я не могу выберите и щелкните элементы вкладки.

Элемент inspect показывает следующий dom

<li tabindex="0" class="prod-jss21 prod-jss24 prod-jss26 tabs__list__item--mlNCRXql" 
  role="tab" aria-disabled="false" aria-selected="false" 
  data-qa="descriptionTab_resultDescription">
  <span class="prod-jss25">Description</span></li>
  <span class="prod-jss25">Description</span>

Я написал следующий код

Sub espacenet()

    Dim IE As New SHDocVw.InternetExplorer
    Dim HTMLDoc As MSHTML.HTMLDocument
    
    IE.Visible = True
    IE.navigate "https://worldwide.espacenet.com/patent/search/family/051267404/publication/US8805587B1?q=pn%3DUS8805587B1"
    
    Do While IE.readyState <> READYSTATE_COMPLETE
    Loop
    
    Set HTMLDoc = IE.Document
    
    Debug.Print (HTMLDoc.body.innerText)
    
    '------------------
    
    Dim HTMLTable As MSHTML.IHTMLElement
    Dim HTMLTables As MSHTML.IHTMLElementCollection
    Dim HTMLRow As MSHTML.IHTMLElement
    Dim HTMLCell As MSHTML.IHTMLElement
    Dim RowNum As Long, ColNum As Integer
    
    
  
    
   Set HTMLTables = HTMLDoc.getElementsByTagName("span")
    
    For Each HTMLTable In HTMLTables
            Debug.Print (HTMLTable.innerText)
    Next HTMLTable
    
    Set HTMLTable = HTMLDoc.getElementById("biblio-applicants-content")
       Debug.Print (HTMLTable.innerText)
    
     Set HTMLTable = HTMLDoc.getElementById("biblio-title-content")
       Debug.Print (HTMLTable.innerText)
        
      Set HTMLTable = HTMLDoc.getElementById("biblio-abstract-content")
       Debug.Print (HTMLTable.innerText)
       
    Set HTMLTable = HTMLDoc.getElementById("biblio-inventors-content")
    Debug.Print (HTMLTable.innerText)
    
     Set HTMLTable = HTMLDoc.getElementById("biblio-priority-numbers-content-0")
       Debug.Print (HTMLTable.innerText)
    
     Set HTMLTable = HTMLDoc.getElementById("biblio-Application-number-content")
       Debug.Print (HTMLTable.innerText)
       
       Set HTMLTable = HTMLDoc.getElementById("biblio-Publication-number-content")
       Debug.Print (HTMLTable.innerText)
  end sub

1 Ответ

0 голосов
/ 21 июня 2020

Страница выполняет несколько нетипичную функцию. Если ширина браузера не менее 1350 пикселей, вкладки не отображаются, но навигация осуществляется в виде раскрывающегося списка. Таким образом, есть возможность управлять раскрывающимся списком или отображать браузер достаточно широко.

Я выбрал ширину в макросе. Во-первых, это очень легко реализовать, а во-вторых, раскрывающийся список может никогда не отображаться при высоких разрешениях экрана. Чтобы IE не торчал из экрана вправо, я установил его крайнее левое положение.

Пожалуйста, прочтите также комментарии в коде VBA:

Sub espacenet()

  Dim IE As New SHDocVw.InternetExplorer
  Dim HTMLDoc As MSHTML.HTMLDocument
  Dim HTMLTable As MSHTML.IHTMLElement
  Dim HTMLTables As MSHTML.IHTMLElementCollection
  Dim HTMLRow As MSHTML.IHTMLElement
  Dim HTMLCell As MSHTML.IHTMLElement
  Dim RowNum As Long, ColNum As Integer
  
  'The width must be at least 1.350 pixel to show the tab bar
  'Otherwise it's a dropdown, no tab bar
  IE.Width = 1350
  'Place the IE on the left side of the screen
  IE.Left = 0
  IE.Visible = True
  IE.navigate "https://worldwide.espacenet.com/patent/search/family/051267404/publication/US8805587B1?q=pn%3DUS8805587B1"
  Do While IE.readyState <> 4: DoEvents: Loop
  
  'Manual break to load dynamic content after
  'IE sends ready state complete
  'The last three values are hours, minutes, seconds
  Application.Wait (Now + TimeSerial(0, 0, 5))
  
  Set HTMLDoc = IE.document
  
  Set HTMLTables = HTMLDoc.getElementsByTagName("span")
  
  For Each HTMLTable In HTMLTables
    Debug.Print (HTMLTable.innerText)
  Next HTMLTable
  
  Set HTMLTable = HTMLDoc.getElementById("biblio-applicants-content")
  Debug.Print (HTMLTable.innerText)
  
  Set HTMLTable = HTMLDoc.getElementById("biblio-title-content")
  Debug.Print (HTMLTable.innerText)
  
  Set HTMLTable = HTMLDoc.getElementById("biblio-abstract-content")
  Debug.Print (HTMLTable.innerText)
  
  Set HTMLTable = HTMLDoc.getElementById("biblio-inventors-content")
  Debug.Print (HTMLTable.innerText)
  
  Set HTMLTable = HTMLDoc.getElementById("biblio-priority-numbers-content-0")
  Debug.Print (HTMLTable.innerText)
  
  Set HTMLTable = HTMLDoc.getElementById("biblio-Application-number-content")
  Debug.Print (HTMLTable.innerText)
  
  Set HTMLTable = HTMLDoc.getElementById("biblio-Publication-number-content")
  Debug.Print (HTMLTable.innerText)
  
  'The query selector from QHaars comment
  HTMLDoc.querySelector("[data-qa='descriptionTab_resultDescription']").Click
  
  'After a "click" you need another short break to do the things after the click
  Application.Wait (Now + TimeSerial(0, 0, 3))
  
  'Here more of your code
End Sub
...