귀하의 xpath에 아무런 문제가 없습니다. 테이블에서 데이터를 가져 오는 방법을 모르는 것으로 가정합니다. xpaths를 찾아야합니다.
public static void Main(string[] args)
{
HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.manualslib.com/brand/A.html");
request.Method = "GET";
request.ContentType = "text/html;charset=utf-8";
using (var response = (HttpWebResponse)request.GetResponse())
{
using (var stream = response.GetResponseStream())
{
doc.Load(stream, Encoding.GetEncoding("utf-8"));
}
}
}
catch (WebException ex)
{
Console.WriteLine(ex.Message);
}
//Works fine
HtmlNode tablebody = doc.DocumentNode.SelectSingleNode("//table[contains(@class, 'table')]/tbody");
foreach(HtmlNode tr in tablebody.SelectNodes("./tr"))
{
Console.WriteLine("\nTableRow: ");
foreach(HtmlNode td in tr.SelectNodes("./td"))
{
if (td.GetAttributeValue("class", "null") == "col1")
{
Console.Write("\t " + td.InnerText);
}
else
{
HtmlNode temp = td.SelectSingleNode(".//div[@class='catel']/a");
if (temp != null)
{
Console.Write("\t " + temp.GetAttributeValue("href", "no url"));
}
}
}
}
Console.ReadKey();
}
먼저 xpath를 사용하여 tbody 노드로 이동합니다. 단, 테이블의 클래스에있는 특성에 'table'이 포함되어 있어야합니다.
//table[contains(@class, 'table')]/tbody
이제 tr (테이블 행)이라고하는 모든 노드를 선택합니다.
./tr
여기서 점은 현재 상황에서 우리는 모든 tr-node를 찾을 것이라는 것을 의미합니다. 그런 다음 각 tr 노드에서 다음을 사용하여 모든 td 노드를 찾습니다.
./td
이제 각 테이블 셀에서 데이터를 가져 오려고합니다. 첫 번째 td에서는 class-attribute가 'col1'과 동일하다는 것을 알 수 있습니다. 그래서 td가 그 값을 가진 클래스를 포함한다면 - 우리는 그 td-node 안에 텍스트를 가져 가고 싶습니다.
그러나 그것이 그 속성을 포함하지 않는다면 우리는 'catel'값을 가진 class-attribute를 가진 div 안의 앵커 태그를 원한다는 것을 안다.
그 앵커 태그 안에 href 속성의 값을 얻고 싶습니다.