HTML Agility Pack und LINQ

c# html-agility-pack linq web-scraping

Frage

Ich möchte mit HAP Daten aus einer Tabelle auf einer Website extrahieren, die Zeilen durchlaufen, um einen Wert in einer Spalte zu finden, der einer vordefinierten Zeichenfolge entspricht, und dann nur die Zeile speichern, die übereinstimmt. Dann habe ich ein Wörterbuch mit der Spaltenüberschrift als Schlüssel und dem Spaltentext für die ausgewählte Zeile als Wert.

Tabelle ex.

<table id="Table3">
<tbody><tr><td></td></tr>
<tr>
<td>ID</td>
<td>Last Name</td>
<td>First Name</td>
<td>Birth Date</td>
<td>Relation</td>
</tr>

<tr>
<td>nbsp;01&nbsp;</td>
<td>&nbsp;DUNN          &nbsp;</td>
<td>&nbsp;JOE          &nbsp;</td>
<td>&nbsp;19931209&nbsp;</font></td>
<td>&nbsp;Son&nbsp;</td>
</tr>

<tr>
<td>nbsp;02&nbsp;</td>
<td>&nbsp;SMITH          &nbsp;</td>
<td>&nbsp;MARY          &nbsp;</td>
<td>&nbsp;19950206&nbsp;</font></td>
<td>&nbsp;Daughter&nbsp;</td>
</tr>

<tr>
<td>nbsp;03&nbsp;</td>
<td>&nbsp;ROCKFORD          &nbsp;</td>
<td>&nbsp;BILL          &nbsp;</td>
<td>&nbsp;20000320&nbsp;</font></td>
<td>&nbsp;Son&nbsp;</td>
</tr>

</tbody></table>

Wenn mein Geburtsdatum mit 20000320 übereinstimmt, möchte ich alle Informationen zu Bill.

Das Hinzufügen der Header-Titel zur Liste ist kein Problem. Ich weiß, dass ich die Benutzerzeile nicht richtig geschrieben habe. Was ich habe, versucht immer noch, eine Liste von Zeilen statt einer Zeile zu erhalten. Ein weiteres Problem, auf das ich mit der Benutzerzeile stoße, ist, dass der innere Text mit "& nbsp" darin zurückkommt und ich nicht einfach einen .Replace machen kann, also brauche ich einen Weg, um die Leerzeichen zu entfernen. Ich bin offen für alle Vorschläge. Klügere Wege, all dies zu tun usw.

List<string> headerList = new List<string>();
List<string> userList = new List<string>();

var htmlRows = htmlDoc.DocumentNode.SelectNodes("//*[@id=\"Table3\"]/tbody/tr");
if(htmlRows != null)
{
     // Add first row which contains column headings
     htmlRows[2]
         .Elements("td")
         .Select(td => td.InnerText.Trim())
         .ToList()
         .ForEach(header => headerList.Add(header));

     // Add user rows
     htmlRows
         .Skip(3)
         .Select(tr => tr.Elements("td")
             .Where(td => td.InnerText.Trim() == dteDOB))
             .ToList()
         .ForEach(row => userList.Add(row));

    for(int i = 0; i < headerList.Count; i++)
    {
        if(headerList.Count == userList.Count && userList[i] != null)
            dictValues.Add(headerList[i], userList[i]);                 
    }
}

Akzeptierte Antwort

Sie können versuchen, die gesamte tr mit dem Wert in td zu wählen, denke ich

//*[@id=\"Table3\"]/tbody/tr[td//text()[contains(., 'targetString')]]

Schau dir das an

XPath zum Auswählen einer Tabellenzeile mit einer Zelle, die den angegebenen Text enthält



Related

Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum