Как получить эти данные
Я ищу, чтобы очистить три элемента, которые выделены и граничат с примером HTML ниже. Я также выделил несколько маркеров, которые выглядят полезными.
Как бы вы это сделали?
Решение
Хорошо, так что это не был хороший вопрос, и я на самом деле удивлен, что за него больше не голосовали! Ну что ж, вот несколько хлебных крошек для кого-то другого.
Три из четырех элементов информации, которые мне нужны, - это внутренний текст элемента span с известным идентификатором (т. Е. $0,83 для "yfs_l10_gm150220c00036500"), поэтому следующий вспомогательный класс представляется мне достойным и прямым выстрелом:
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' GetSpanTextForId
'
' Returns the inner text from a span element known by the passed id
'
' param doc: the source HTMLDocument
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function GetSpanTextForId(ByRef doc As HTMLDocument, ByVal spanId As String) As Double
' Error Handling
On Error GoTo ErrHandler
Dim sRoutine As String
sRoutine = cModule & ".GetSpanTextForId"
CheckArgNotNothing doc, "doc"
CheckArgNotBadString spanId, "spanId"
' Procedure
Dim oSpan As HTMLSpanElement
Set oSpan = doc.getElementById(spanId)
Check Not oSpan Is Nothing, "Could not find span with id: " & Bracket(spanId)
GetSpanTextForId = oSpan.innerText
Exit Function
ErrHandler:
Select Case DspErrMsg(sRoutine)
Case Is = vbAbort: Stop: Resume 'Debug mode - Trace
Case Is = vbRetry: Resume 'Try again
Case Is = vbIgnore: 'End routine
End Select
End Function
Единственный элемент, который не известен непосредственно в span - это OpenInterest, который является частью таблицы, являющейся вторым дочерним элементом элемента с идентификатором. Следующие методы возвращают ячейку, которая следует сразу за ячейкой с текстом, который я хочу (т.е. "Открытый интерес")
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' GetOpenInterest
'
' The latest available Open Interest.
'
' param doc: the source HTMLDocument
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Function GetOpenInterest(ByRef doc As HTMLDocument) As Integer
Dim tbl As IHTMLTable
Set tbl = GetSummaryDataTable(doc, 1)
Dim k As Integer
k = mWebScrapeHelpers.GetCellNumberForTextStartingWith(tbl, "Open Interest:")
GetOpenInterest = CInt(mWebScrapeHelpers.GetCellTextFromCellNumber(tbl, k + 1))
End Function
Function GetCellNumberForTextStartingWith(ByRef tbl As IHTMLTable, ByRef s As String) As Integer
' Error Handling
On Error GoTo ErrHandler
Dim sRoutine As String
sRoutine = cModule & ".GetCellNumberForTextStartingWith"
CheckArgNotNothing tbl, "tbl"
' Procedure
Dim tblCell As HTMLTableCell
Dim k As Integer
For Each tblCell In tbl.Cells
If tblCell.innerText Like ("*" & s) Then
GetCellNumberForTextStartingWith = k
Exit Function
End If
k = k + 1
Next
' if we got here it was not found so
GetCellNumberForTextStartingWith = -1
Exit Function
ErrHandler:
Select Case DspErrMsg(sRoutine)
Case Is = vbAbort: Stop: Resume 'Debug mode - Trace
Case Is = vbRetry: Resume 'Try again
Case Is = vbIgnore: 'End routine
End Select
End Function
Function GetCellTextFromCellNumber(ByRef tbl As IHTMLTable, ByRef nbr As Integer) As String
' Error Handling
On Error GoTo ErrHandler
Dim sRoutine As String
sRoutine = cModule & ".GetCellNumberForTextStartingWith"
CheckArgNotNothing tbl, "tbl"
Check tbl.Cells.Length > 0, "table is empty"
Check tbl.Cells.Length >= nbr, "table only has " & tbl.Cells.Length & " cells; can't get cell number " & nbr
' Procedure
GetCellTextFromCellNumber = tbl.Cells(nbr).innerText
Exit Function
ErrHandler:
Select Case DspErrMsg(sRoutine)
Case Is = vbAbort: Stop: Resume 'Debug mode - Trace
Case Is = vbRetry: Resume 'Try again
Case Is = vbIgnore: 'End routine
End Select
End Function
Эти методы работают хорошо, но кажется, что есть много разных подходов, которые будут работать, включая подход синтаксического анализа регулярных выражений, предложенный в качестве ответа. Отличная ссылка от RedShift дала больше смысла в анализе html и разработке стратегии.
ура
1 ответ
Я бы, вероятно, использовал бы синтаксический анализатор XML, чтобы сначала получить текстовое содержимое (или это: xmlString.replace (/ <[^>] +> / g, ""), чтобы заменить все теги пустыми строками), а затем использовать следующие регулярные выражения для извлеките нужную вам информацию:
/-OPR\s+(\d+\.\d+)/
/Bid:\s+(\d+\.\d+)/
/Ask:\s+(\d+\.\d+)/
/Open Interest:\s+(\d+,\d+)/
Этот процесс может быть легко выполнен в nodejs ( подробнее) или на любом другом языке, который поддерживает регулярные выражения.
живое демо:
- Ждет 1 секунду, затем удаляет теги.
- Подождите еще секунду, затем найдет все шаблоны и создаст таблицу.
wait = true; // Set to false to execute instantly.
var elem = document.getElementById("parsingStuff");
var str = elem.textContent;
var keywords = ["-OPR", "Bid:", "Ask:", "Open Interest:"];
var output = {};
var timeout = 0;
if (wait) timeout = 1000;
setTimeout(function() { // Removing tags.
elem.innerHTML = elem.textContent;
}, timeout);
if (wait) timeout = 2000;
setTimeout(function() { // Looking for patterns.
for (var i = 0; i < keywords.length; i++) {
output[keywords[i]] = str.match(RegExp(keywords[i] + "\\s+(\\d+[\\.,]\\d+)"))[1];
}
// Creating basic table of found data.
elem.innerHTML = "";
var table = document.createElement("table");
for (k in output) {
var tr = document.createElement("tr");
var th = document.createElement("th");
var td = document.createElement("td");
th.style.border = "1px solid gray";
td.style.border = "1px solid gray";
th.textContent = k;
td.textContent = output[k];
tr.appendChild(th);
tr.appendChild(td);
table.appendChild(tr);
}
elem.appendChild(table);
}, timeout);
<div id="parsingStuff">
<div class="yfi_rt_quote_summary" id="yfi_rt_quote_summary">
<div class="hd">
<div class="title">
<h2>GM Feb 2015 36.500 call (GM150220C00036500)</h2>
<span class="rtq_exch">
<span class="rtq_dash">-</span>OPR
</span>
<span class="wl_sign"></span>
</div>
</div>
<div class="yfi_rt_quote_summary_rt_top sigfig_promo_1">
<div>
<span class="time_rtq_ticker">
<span id="yfs_110_gm150220c00036500">0.83</span>
</span>
</div>
</div>undefined</div>undefined
<div class="yui-u first yfi-start-content">
<div class="yfi_quote_summary">
<div id="yfi_quote_summary_data" class="rtq_table">
<table id="table1">
<tr>
<th scope="row" width="48%">Bid:</th>
<td class="yfnc_tabledata1">
<span id="yfs_b00_gm150220c00036500">0.76</span>
</td>
</tr>
<tr>
<th scope="row" width="48%">Ask:</th>
<td class="yfnc_tabledata1">
<span id="yfs_a00_gm150220c00036500">0.90</span>
</td>
</tr>
</table>
<table id="table2">
<tr>
<th scope="row" width="48%">Open Interest:</th>
<td class="yfnc_tabledata1">11,579</td>
</tr>
</table>
</div>
</div>
</div>
</div>