HtmlAgilityPack을 사용하여 tr 링크 및 콘텐츠를 얻으려면 어떻게해야합니까?

c# html-agility-pack html-parsing parsing

문제

HtmlAgilityPack과 함께 HTML 소스를 얻으려면이 코드를 사용합니다.

private string GetUrlSource(string urlAddress)
        {
            string content = string.Empty;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlAddress);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            if (response.StatusCode == HttpStatusCode.OK)
            {
                Stream receiveStream = response.GetResponseStream();
                StreamReader readStream = null;
                if (response.CharacterSet == null)
                    readStream = new StreamReader(receiveStream);
                else
                    readStream = new StreamReader(receiveStream, Encoding.GetEncoding(response.CharacterSet));
                content = readStream.ReadToEnd();
                response.Close();
                readStream.Close();
            }
            return content;
        }

그런 다음이 코드를 사용하여 데이터를 가져옵니다.

                var source = GetUrlSource(urlAddress);
                var htmlDoc = new HtmlAgilityPack.HtmlDocument();
                htmlDoc.LoadHtml(source);
var nodes = htmlDoc.DocumentNode.SelectNodes("//div[@class='linear-view']/table/tr/td");

노드에 대한 결과는 다음과 같습니다.

<tr>
  <th>Title</th>
  <th>Publisher</th>
</tr>
<tr>
  <td><a href="http://link1.com" id="14.4">Title1</a></td>
  <td>Publisher1</td>
</tr>
<tr>
  <td><a href="http://link2.com" id="12.0">Title2</a></td>
  <td>Publisher2</td>
</tr>
<tr>
  <td><a href="http://link3.com/" id="84.4">Title3</a></td>
  <td>Publisher3</td>
</tr>

데이터를 가져 오기 위해이 코드를 사용합니다.

foreach (var node in nodes)
                {
                    HtmlNodeCollection rows = node.SelectNodes(".//a");
                    if (rows != null)
                    {
                        for (int j = 0; j < rows.Count; ++j)
                        {
                            var link = rows[j].Attributes["href"].Value;
                            var title = rows[j].InnerText;
                        }
                    }
                    else
                    {
                        var publisher = node.InnerText;
                    }
                }

& else없이 모든 tr 태그의 링크, 제목 및 게시자를 얻으려면 어떻게해야합니까? 예 : http://link1.com , Title1 , Publisher1http://link2.com , Title2 , Publisher2http://link3.com , Title3 , Publisher3

수락 된 답변

가능한 많은 방법 중 하나 :

//select <tr> having child node <td>
var tr = doc.DocumentNode.SelectNodes("//div[@class='linear-view']/table/tr[td]");
foreach (HtmlNode node in tr)
{
    //select <td> having child node <a>
    var td1 = node.SelectSingleNode("./td[a]"); //or using index: ./td[1]
    var link = td1.FirstChild.Attributes["href"].Value;
    var title = td1.InnerText;
    //select <td> not having child node <a>
    var publisher = node.SelectSingleNode("./td[not(a)]") //using index: ./td[2]
                        .InnerText;
}


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