VBA Excel получает текст внутри HTMLObject

Я знаю, что это действительно легко для некоторых из вас там. Но я копался в интернете и не нашел ответа. Мне нужно получить название компании, которое находится внутри

tbody tr td a eBay-tradera.com

а также

td class="bS aR" 970,80

/td /tr /tbody

<tbody id="matrix1_group0">
<tr class="oR" onmouseover="onMouseOver(this, false)" onmouseout="onMouseOut(this, false)" onclick="onClick(this, false)">
<td class="bS">&nbsp;</td>
<td>
<a href="aProgramInfoApplyRead.action?programId=175&amp;affiliateId=2014848" title="http://www.tradera.com/" target="_blank">

   eBay-Tradera.com

</a>
</td>
<td class="aR">
<a href="/pan/aProgramInfoApplyRead.action?programId=175&amp;affiliateId=2014848" title="/pan/aProgramInfoApplyRead.action?programId=175&amp;affiliateId=2014848">175</a></td>
<td class="bS aR">0</td><td class="bS aR">0</td><td class="bS aR">187</td>
<td class="aR">0,00%</td><td class="bS aR">124</td>
<td class="aR">0,00%</td>
<td class="bS aR">26</td>
<td class="aR">20,97%</td>
<td class="bS aR">32</td>
<td class="aR">60,80</td>
<td class="aR">25,81%</td>
<td class="bS aR">5&nbsp;102,00</td>
<td class="bS aR">0,00</td>
<td class="aR">0,00</td>
<td class="bS aR">

   970,80

</td>
</tr>
</tbody>

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

Set TDelements = document.getElementById("matrix1_group0").document.getElementsbytagname("a").innerHTML
r = 0
C = 0

For Each TDelement In TDelements
Blad1.Range("A1").Offset(r, C).Value = TDelement.innerText
r = r + 1
Next

Спасибо заранее, я знаю, что это может быть слишком просто. Но я надеюсь, что у других людей может быть такая же проблема, и это будет полезно и для них. Причина «r = r + 1» в том, что в этом списке гораздо больше компаний. Я просто хотел сделать это как можно проще. Спасибо еще раз!


person Niklas Andersson    schedule 24.11.2014    source источник
comment
Я полагаю, вы не даете нам ссылку, потому что это раздел, защищенный паролем, но не могли бы вы сделать снимок таблицы, как она выглядит в Интернете?   -  person Matteo NNZ    schedule 25.11.2014
comment
document в document.getElementById("matrix1_group0")... нужен его родитель, такой как ie.document.getElementById("matrix1_group0")....   -  person    schedule 25.11.2014


Ответы (2)


Вам нужно будет указать расположение элемента в таблице. Ebay, кажется, запутывает имена классов, поэтому мы не можем полагаться на их согласованность. Я бы также обычно не полагался на то, что элементы по их табличному индексу непротиворечивы, но я не вижу никакого способа обойти это.

Я предполагаю, что это HTML-документ, который вы ищете

<tbody id="matrix1_group0">
  <tr class="oR" onmouseover="onMouseOver(this, false)" onmouseout="onMouseOut(this, false)" onclick="onClick(this, false)">
    <td class="bS">&nbsp;</td>
    <td>
      <a href="aProgramInfoApplyRead.action?programId=175&amp;affiliateId=2014848" title="http://www.tradera.com/" target="_blank">
        eBay-Tradera.com  <!-- <=== You want this? -->
      </a>
    </td>
    <!-- ... -->
  </tr>
  <!-- ... -->
</tbody>

Мы можем игнорировать остальную часть документа, так как элемент таблицы имеет идентификатор. Короче говоря, мы предполагаем, что

.getElementById("matrix1_group0").getElementsByTagName("TR")

вернет коллекцию объектов строк html, отсортированных по их внешнему виду.

Set matrix = document.getElementById("matrix1_group0")
Set firstRow = matrix.getElementsByTagName("TR")(1)
Set firstRowSecondCell = firstRow.getElementsByTagName("TD")(2)
traderaName = firstRowSecondCell.innerText

Конечно, вы могли бы встроить все это как

document.getElementById("matrix1_group0").getElementsByTagName("TR")(1).getElementsByTagName("TD")(2).innerText

но это затруднит отладку. Кроме того, если веб-страница когда-либо будет представлена ​​вам в другом формате, это не сработает. Ebay намеренно усложняет сбор данных из соображений безопасности.

person cheezsteak    schedule 24.11.2014
comment
Что ж, прочитав ответ Cheezsteak, я просто удаляю свой и предлагаю вам следовать его подходу. Это гораздо более гибко и хорошо объясняет то, что я делал раньше, лучше сосредоточить внимание на лучшем ответе, чем на двух похожих. +1 - person Matteo NNZ; 25.11.2014
comment
Я получаю ошибку времени выполнения 424, требуется объект Есть ли что-то, что я пропустил, чтобы сообщить вам? - person Niklas Andersson; 26.11.2014
comment
@NiklasAndersson Сначала подтвердите, что документ не изменил свою структуру. В противном случае см. этот ответ об ожидании загрузки элементов перед попыткой доступа к ним. - person cheezsteak; 26.11.2014
comment
Я выполняю Next Do While ie.busy: DoEvents: Loop While ie.ReadyState ‹› 4 DoEvents Wend Я получил данные на странице. Просто не правильные данные. Он все еще застревает в Set matrix = - person Niklas Andersson; 30.11.2014

Только с показанным HTML вы можете использовать селекторы CSS для их получения:

a[href*='aProgramInfoApplyRead.action?programId']

В котором говорится, что тег a с атрибутом href содержит строку 'aProgramInfoApplyRead.action?programId'. Это соответствует двум элементам, но первый — тот, который вам нужен.

Селектор CSS:

Селектор CSS


VBA:

Вы можете использовать .querySelector метод .document для получения первого совпадения

Debug.Print ie.document.querySelector("a[href*='aProgramInfoApplyRead.action?programId']").innerText
person QHarr    schedule 29.06.2018
comment
Вы пробовали это, пожалуйста? - person QHarr; 02.10.2018