Selenium VBA:获取具有<tr和<td下的<div class元素的表格内容

huangapple go评论137阅读模式
英文:

Selenium VBA: Get the table content which are having <div class elements under <tr and <td

问题

我想从以下HTML代码中提取表格内容,这些内容在<div class下列出。我尝试了不同的代码,但找不到正确的解决方案。

  1. <table class="ISLogIn AvgTotal" id="invoiceAmountAvgTotalNewDesign" width="100%">
  2. <tbody><tr>
  3. <td colspan="8">
  4. <div class="container invoice-lines-container">
  5. <div class="list invoice-line-total">
  6. <div class="col-xs-4 invoice-line-name">Avg Total</div>
  7. <div class="col-xs-6 invoice-line-name"></div>
  8. <div class="col-xs-2 invoice-line-value">
  9. <strong data-bind="autoNumeric: hasDiscrepancyTotalInvoiceWithDb() ? invoiceAmountDbData().SubTotal : subTotal, autoNumericOptions: $root.moneyNegativeFormat()">135.43</strong>
  10. </div>
  11. </div>
  12. </div>
  13. </td>
  14. </tr>
  15. <tr>
  16. <td colspan="8">
  17. <div class="container invoice-lines-container">
  18. <div class="list invoice-line-header">
  19. <div class="invoice-line-name col-xs-4" data-bind="css: { 'col-xs-3': isEditableAdditionalApprovalCode(), 'col-xs-4': isEditableAdditionalApprovalCode() === false }">
  20. <span>Sale </span>
  21. </div>
  22. <div class="invoice-line-name col-xs-3" data-bind="css: { 'col-xs-2': isEditableAdditionalApprovalCode(), 'col-xs-3': isEditableAdditionalApprovalCode() === false }">
  23. </div>
  24. <div class="invoice-line-value col-xs-4" data-bind="css: { 'col-xs-6': isEditableAdditionalApprovalCode(), 'col-xs-4': isEditableAdditionalApprovalCode() === false }"></div>
  25. <div class="col-xs-1 invoice-line-value">Amount</div>
  26. </div>
  27. <div class="list invoice-line-item-total" data-bind="visible: isInternational()" style="display: none;">
  28. <div class="col-xs-4 invoice-line-name">Total Sale</div>
  29. <div class="col-xs-6 invoice-line-name"></div>
  30. <div class="col-xs-2 invoice-line-value">
  31. </div>
  32. </div>
  33. <div class="list invoice-line-item-total" data-bind="visible: !isInternational()">
  34. <div class="col-xs-4 invoice-line-name">Total Sale</div>
  35. <div class="col-xs-6 invoice-line-name"></div>
  36. <div class="col-xs-2 invoice-line-value">
  37. <span data-bind="autoNumeric: hasDiscrepancyTotalInvoiceWithDb() ? invoiceAmountDbData().TotalAmountTax : printTaxAmount(), autoNumericOptions: $root.moneyNegativeFormat()">3.14</span>
  38. </div>
  39. </div>
  40. </div>
  41. </td>
  42. </tr>
  43. <tr>
  44. <td colspan="8">
  45. <div class="container invoice-lines-container">
  46. <div class="list invoice-line-total">
  47. <div class="col-xs-4 invoice-line-name">Total (<span data-bind="text: workInfo.currency">INR</span>)</div>
  48. <div class="col-xs-6 invoice-line-name"></div>
  49. <div class="col-xs-2 invoice-line-value">
  50. <span data-bind="autoNumeric: calculatedTotal(), autoNumericOptions: $root.moneyNegativeFormat()">138.57</span>
  51. </div>
  52. </div>
  53. </div>
  54. </td>
  55. </tr>
  56. </tbody></table>

以下是我尝试提取表格内容的VBA Selenium代码,以表格格式提取为目标。我使用Chrome和Selenium。

  1. Option Explicit
  2. Sub table()
  3. Dim d As New ChromeDriver
  4. Dim iM As Object, iMs As Object
  5. Dim S2 As Long, i As Long
  6. d.Get "My URL"
  7. Application.Wait (Now + TimeValue("00:00:03"))
  8. With Sh2
  9. Set iMs = d.FindElementsByCss(".ISLogIn AvgTotal div[class^='list invoice-line']")
  10. .Activate
  11. For Each iM In iMs
  12. S2 = .Cells(Rows.Count, 2).End(xlUp).Row + 1: .Cells(S2, 1).Select
  13. .Cells(S2, 2) = iM.Text
  14. Next iM
  15. End With
  16. Set iM = Nothing: Set wOrder = Nothing: Set Sc = Nothing
  17. End Sub

以下是我尝试的输出:

Selenium VBA:获取具有<tr和<td下的<div class元素的表格内容

Selenium VBA:获取具有<tr和<td下的<div class元素的表格内容

请以正确的代码指导我。非常感谢。

英文:

I want to extract the table content from the following HTML code which are listed under <div class. I tried with different codes but i couldn't find the correct solution.

<!-- begin snippet: js hide: false console: true babel: false -->

<!-- language: lang-html -->

  1. &lt;table class=&quot;ISLogIn AvgTotal&quot; id=&quot;invoiceAmountAvgTotalNewDesign&quot; width=&quot;100%&quot;&gt;
  2. &lt;tbody&gt;&lt;tr&gt;
  3. &lt;td colspan=&quot;8&quot;&gt;
  4. &lt;div class=&quot;container invoice-lines-container&quot;&gt;
  5. &lt;div class=&quot;list invoice-line-total&quot;&gt;
  6. &lt;div class=&quot;col-xs-4 invoice-line-name&quot;&gt;Avg Total&lt;/div&gt;
  7. &lt;div class=&quot;col-xs-6 invoice-line-name&quot;&gt;&lt;/div&gt;
  8. &lt;div class=&quot;col-xs-2 invoice-line-value&quot;&gt;
  9. &lt;strong data-bind=&quot;autoNumeric: hasDiscrepancyTotalInvoiceWithDb() ? invoiceAmountDbData().SubTotal : subTotal, autoNumericOptions: $root.moneyNegativeFormat()&quot;&gt;135.43&lt;/strong&gt;
  10. &lt;/div&gt;
  11. &lt;/div&gt;
  12. &lt;/div&gt;
  13. &lt;/td&gt;
  14. &lt;/tr&gt;
  15. &lt;tr&gt;
  16. &lt;td colspan=&quot;8&quot;&gt;
  17. &lt;div class=&quot;container invoice-lines-container&quot;&gt;
  18. &lt;div class=&quot;list invoice-line-header&quot;&gt;
  19. &lt;div class=&quot;invoice-line-name col-xs-4&quot; data-bind=&quot;css: { &#39;col-xs-3&#39;: isEditableAdditionalApprovalCode(), &#39;col-xs-4&#39;: isEditableAdditionalApprovalCode() === false }&quot;&gt;
  20. &lt;span&gt;Sale &lt;/span&gt;
  21. &lt;/div&gt;
  22. &lt;div class=&quot;invoice-line-name col-xs-3&quot; data-bind=&quot;css: { &#39;col-xs-2&#39;: isEditableAdditionalApprovalCode(), &#39;col-xs-3&#39;: isEditableAdditionalApprovalCode() === false }&quot;&gt;
  23. &lt;/div&gt;
  24. &lt;div class=&quot;invoice-line-value col-xs-4&quot; data-bind=&quot;css: { &#39;col-xs-6&#39;: isEditableAdditionalApprovalCode(), &#39;col-xs-4&#39;: isEditableAdditionalApprovalCode() === false }&quot;&gt;&lt;/div&gt;
  25. &lt;div class=&quot;col-xs-1 invoice-line-value&quot;&gt;Amount&lt;/div&gt;
  26. &lt;/div&gt;
  27. &lt;div class=&quot;list invoice-line-item-total&quot; data-bind=&quot;visible: isInternational()&quot; style=&quot;display: none;&quot;&gt;
  28. &lt;div class=&quot;col-xs-4 invoice-line-name&quot;&gt;Total Sale&lt;/div&gt;
  29. &lt;div class=&quot;col-xs-6 invoice-line-name&quot;&gt;&lt;/div&gt;
  30. &lt;div class=&quot;col-xs-2 invoice-line-value&quot;&gt;
  31. &lt;/div&gt;
  32. &lt;/div&gt;
  33. &lt;div class=&quot;list invoice-line-item-total&quot; data-bind=&quot;visible: !isInternational()&quot;&gt;
  34. &lt;div class=&quot;col-xs-4 invoice-line-name&quot;&gt;Total Sale&lt;/div&gt;
  35. &lt;div class=&quot;col-xs-6 invoice-line-name&quot;&gt;&lt;/div&gt;
  36. &lt;div class=&quot;col-xs-2 invoice-line-value&quot;&gt;
  37. &lt;span data-bind=&quot;autoNumeric: hasDiscrepancyTotalInvoiceWithDb() ? invoiceAmountDbData().TotalAmountTax : printTaxAmount(), autoNumericOptions: $root.moneyNegativeFormat()&quot;&gt;3.14&lt;/span&gt;
  38. &lt;/div&gt;
  39. &lt;/div&gt;
  40. &lt;/div&gt;
  41. &lt;/td&gt;
  42. &lt;/tr&gt;
  43. &lt;tr&gt;
  44. &lt;td colspan=&quot;8&quot;&gt;
  45. &lt;div class=&quot;container invoice-lines-container&quot;&gt;
  46. &lt;div class=&quot;list invoice-line-total&quot;&gt;
  47. &lt;div class=&quot;col-xs-4 invoice-line-name&quot;&gt;Total (&lt;span data-bind=&quot;text: workInfo.currency&quot;&gt;INR&lt;/span&gt;)&lt;/div&gt;
  48. &lt;div class=&quot;col-xs-6 invoice-line-name&quot;&gt;&lt;/div&gt;
  49. &lt;div class=&quot;col-xs-2 invoice-line-value&quot;&gt;
  50. &lt;span data-bind=&quot;autoNumeric: calculatedTotal(), autoNumericOptions: $root.moneyNegativeFormat()&quot;&gt;138.57&lt;/span&gt;
  51. &lt;/div&gt;
  52. &lt;/div&gt;
  53. &lt;/div&gt;
  54. &lt;/td&gt;
  55. &lt;/tr&gt;
  56. &lt;/tbody&gt;&lt;/table&gt;

<!-- end snippet -->

Below is my vba selenium code which grabs all the row information into one cell.
Im trying to extract as table format. I use chrome with selenium.

  1. Option Explicit
  2. Sub table()
  3. Dim d As New ChromeDriver
  4. Dim iM As Object, iMs As Object
  5. Dim S2 As Long, i As Long
  6. d.Get &quot;My URL&quot;
  7. Application.Wait (Now + TimeValue(&quot;00:00:03&quot;))
  8. With Sh2
  9. Set iMs = d.FindElementsByCss(&quot;.ISLogIn AvgTotal div[class^=&#39;list invoice-line&#39;]&quot;)
  10. .Activate
  11. For Each iM In iMs
  12. S2 = .Cells(Rows.Count, 2).End(xlUp).Row + 1: .Cells(S2, 1).Select
  13. .Cells(S2, 2) = iM.Text
  14. Next iM
  15. End With
  16. Set iM = Nothing: Set wOrder = Nothing: Set Sc = Nothing
  17. End Sub

Below is the output that im trying for

Selenium VBA:获取具有<tr和<td下的<div class元素的表格内容

Selenium VBA:获取具有<tr和<td下的<div class元素的表格内容

Please guide me with the correct code. Thanks a lot.

答案1

得分: 1

这将使您更接近解决方案的代码部分:

  1. Option Explicit
  2. Sub table()
  3. Dim k As Integer
  4. Dim d As New ChromeDriver
  5. Dim iM As WebElement, iMs As Object
  6. Dim sT As String, iV As Selenium.List
  7. Dim S2 As Long, i As Long
  8. d.Get "您的网址"
  9. Application.Wait (Now + TimeValue("00:00:03"))
  10. With Sh2
  11. Set iMs = d.FindElementsByCss("div[class^='list invoice-line']")
  12. .Activate
  13. For Each iM In iMs
  14. S2 = .Cells(Rows.Count, 2).End(xlUp).Row + 1
  15. sT = getTitle(iM)
  16. Set iV = iM.FindElementsByClass("invoice-line-value")
  17. For k = 1 To iV.Count
  18. If iV(k).Text <> "" Then
  19. .Cells(S2, 3) = iV(k).Text
  20. Exit For
  21. End If
  22. Next
  23. .Cells(S2, 2) = sT
  24. Next iM
  25. End With
  26. Set iM = Nothing: Set wOrder = Nothing: Set Sc = Nothing
  27. Set iV = Nothing
  28. d.Quit
  29. End Sub
  30. Function getTitle(iM As WebElement) As String
  31. Dim iT As WebElement
  32. On Error GoTo notFnd
  33. Set iT = iM.FindElementByClass("col-xs-4")
  34. getTitle = iT.Text
  35. Exit Function
  36. notFnd:
  37. getTitle = ""
  38. End Function

请注意,我将 "your url" 替换为了 "您的网址" 以使其更适应中文环境。

英文:

this will get you closer to your solution

  1. Option Explicit
  2. Sub table()
  3. Dim k As Integer
  4. Dim d As New ChromeDriver
  5. Dim iM As WebElement, iMs As Object
  6. Dim sT As String, iV As Selenium.List
  7. Dim S2 As Long, i As Long
  8. d.Get &quot;your url&quot;
  9. Application.Wait (Now + TimeValue(&quot;00:00:03&quot;))
  10. With Sh2
  11. Set iMs = d.FindElementsByCss(&quot;div[class^=&#39;list invoice-line&#39;]&quot;)
  12. .Activate
  13. For Each iM In iMs
  14. S2 = .Cells(Rows.Count, 2).End(xlUp).Row + 1
  15. sT = getTitle(iM)
  16. Set iV = iM.FindElementsByClass(&quot;invoice-line-value&quot;)
  17. For k = 1 To iV.Count
  18. If iV(k).Text &lt;&gt; &quot;&quot; Then
  19. .Cells(S2, 3) = iV(k).Text
  20. Exit For
  21. End If
  22. Next
  23. .Cells(S2, 2) = sT
  24. Next iM
  25. End With
  26. Set iM = Nothing: Set wOrder = Nothing: Set Sc = Nothing
  27. Set iV = Nothing
  28. d.Quit
  29. End Sub
  30. Function getTitle(iM As WebElement) As String
  31. Dim iT As WebElement
  32. On Error GoTo notFnd
  33. Set iT = iM.FindElementByClass(&quot;col-xs-4&quot;)
  34. getTitle = iT.Text
  35. Exit Function
  36. notFnd:
  37. getTitle = &quot;&quot;
  38. End Function

huangapple
  • 本文由 发表于 2023年8月4日 23:25:03
  • 转载请务必保留本文链接:https://go.coder-hub.com/76837298.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定