Html Agility Pack Loop Through Table - 이전 셀 값을 기반으로 셀 값 가져 오기

c# html-agility-pack phantomjs selenium-webdriver web-scraping

문제

여러 테이블이 있고 위치 값이 다른 인덱스 순서로 제공됩니다. 테이블을 반복 할 때 이전 셀 문자열이 "위치"인 경우 어떻게 위치 값을 가져올 수 있습니까? 아래 예제에서는 셀 [7]이지만 다른 테이블에서는 9가됩니다. 셀 내부 텍스트가 "위치"인 후에 조건부로 값을 조건부로 얻을 수 있습니까? 기본적으로 셀 "위치"가 다음 셀의 내부 텍스트를 가져옵니다.

HTML 테이블 :

<table class="tbfix FieldsTable"">
<tbody>
    <tr>
        <td class="name">Last Movement</td>
        <td class="value">Port Exit</td>
    </tr>
    <tr>
        <td class="name">Date</td>
        <td class="value">26/06/2017 00:00:00</td>
    </tr>
    <tr>
        <td class="name">From</td>
        <td class="value">HAMBURGE</td>
    </tr>
    <tr>
        <td class="name">Location</td>
        <td class="value">EUROGATE  HAMBURG</td>
    </tr>
    <tr>
        <td class="name">E/F</td>
        <td class="value">E</td>
    </tr>
</tbody>

컨트롤러 루프 스루 :

foreach (var eachNode in driver.FindElements(By.XPath("//table[contains(descendant::*, 'Last Movement')]")))
                {
                    var cells = eachNode.FindElements(By.XPath(".//td"));
                    cd = new Detail();

                    for (int i = 0; i < cells.Count(); i++)
                    {
                        cd.ActionType = cells[1].Text.Trim();
                        string s = cells[3].Text.Trim();
                        DateTime dt = Convert.ToDateTime(s);
                        if (_minDate > dt) _minDate = dt;
                        cd.ActionDate = dt;

                    }
                }

수락 된 답변

foreach 루프에서 다음과 같이 사용할 수 있습니다.

var location = eachNode.FindElement(By.XPath(".//td[contains(text(),'Location')]/following-sibling::td));

인기 답변

귀하의 데이터가 항상 모든 태그를 반복하고 사전에 데이터를 추가하는 것처럼 구조화되어 있다고 가정합니다.

다음과 같이 시도해보십시오.

Dictionary<string,string> tableData = new Dictionary<string, string>();
var trNodes = eachNode.FindElements(By.TagName("tr"));

foreach (var trNode in trNodes)
{
    var name = trNode.FindElement(By.CssSelector(".name")).Text.Trim();
    var value = trNode.FindElement(By.CssSelector(".value")).Text.Trim();

    tableData.Add(name,value);
}

var location = tableData["location"];

사전 및 구조에 대한 유효성 검사 및 검사를 추가해야하지만 이는 일반적인 아이디어입니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.