XPathですべてのtdを取得するC#

c# html html-agility-pack xpath

質問

私はC#でHtmlAgilityPackを使用してHTMLを解析しようとしています。私は21 tr itemsを持っていて、各tr項目は7 td items持ってい7 td items 。 trとtdのすべてのアイテムを順番に取得するにはどうすればよいですか?今では、1つのtr項目とその7つの項目だけを取得できます。

ここに私のC#コードです:

var url = "url";
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            StreamReader sr = new StreamReader(response.GetResponseStream());
            string sourceCode = sr.ReadToEnd();

            HtmlAgilityPack.HtmlDocument document = new HtmlAgilityPack.HtmlDocument();
            document.LoadHtml(sourceCode);


            var name = document.DocumentNode.SelectNodes("//*[@id=\"searchResultsTable\"]/tbody/tr[1]/td[2]/a[1]")[0].InnerText;
            var year = document.DocumentNode.SelectNodes("//*[@id=\"searchResultsTable\"]/tbody/tr[1]/td[3]")[0].InnerText;
            var km = document.DocumentNode.SelectNodes("//*[@id=\"searchResultsTable\"]/tbody/tr[1]/td[4]")[0].InnerText;
            var color = document.DocumentNode.SelectNodes("//*[@id=\"searchResultsTable\"]/tbody/tr[1]/td[5]")[0].InnerText;
           var price = document.DocumentNode.SelectNodes("//*[@id=\"searchResultsTable\"]/tbody/tr[1]/td[6]")[0].InnerText;
            var date = document.DocumentNode.SelectNodes("//*[@id=\"searchResultsTable\"]/tbody/tr[1]/td[7]")[0].InnerText;
            var location = document.DocumentNode.SelectNodes("//*[@id=\"searchResultsTable\"]/tbody/tr[1]/td[8]")[0].InnerText;

[@id=\"searchResultsTable\"]/tbody/tr[1]/td[position()<8]を使用しようとしましたが、/ n

受け入れられた回答

以下のコードを試してみてください(コンパイルエラーの可能性はありませんが、あなたにはアイデアがあります)。

コード内のコメントにより詳細がわかります。

//GET THE TABLE NODE
HtmlNode table = document.DocumentNode.SelectSingleNode("//*[@id='searchResultsTable']");

//LOOP THROUGH THE TABLE NODE AND FIND EACH TR 
foreach (HtmlNode row in table.SelectNodes("//tr")) {

      //PRINT HERE WHATEVER YOU WANT FOR EACH ROW.
      Console.WriteLine("New Row");

      //LOOP THROUGH THE ALL TD OF EACH TR
      foreach (HtmlNode cell in row.SelectNodes("//td")) {
          //PRINT HERE EACH TD
          Console.WriteLine("cell: " + cell.InnerText);
      } //END TD

}//END TR

人気のある回答

前述したのと同様に、 tr要素をループするセレクタを使用してクエリを実行し、行ごとに固定位置tdノードを選択します。

次のような構造を想定します。

<table id="searchResultsTable">
<tbody>
<tr>
    <td>1</td>
    <td>Name<a>Name 1</a></td>
    <td>Year 1</td>
    <td>KM 1</td>
    <td>Color 1</td>
    <td>Price 1</td>
    <td>Date 1</td>
    <td>Location 1</td>
</tr>
<tr>
    <td>2</td>
    <td>Name<a>Name 2</a></td>
    <td>Year 2</td>
    <td>KM 2</td>
    <td>Color 2</td>
    <td>Price 2</td>
    <td>Date 2</td>
    <td>Location 2</td>
</tr>
</tbody>

例:

<table id="searchResultsTable">
<tbody>
<tr>
    <td>1</td>
    <td>Name<a>Name 1</a></td>
    <td>Year 1</td>
    <td>KM 1</td>
    <td>Color 1</td>
    <td>Price 1</td>
    <td>Date 1</td>
    <td>Location 1</td>
</tr>
<tr>
    <td>2</td>
    <td>Name<a>Name 2</a></td>
    <td>Year 2</td>
    <td>KM 2</td>
    <td>Color 2</td>
    <td>Price 2</td>
    <td>Date 2</td>
    <td>Location 2</td>
</tr>
</tbody>

プロデュース:

<table id="searchResultsTable">
<tbody>
<tr>
    <td>1</td>
    <td>Name<a>Name 1</a></td>
    <td>Year 1</td>
    <td>KM 1</td>
    <td>Color 1</td>
    <td>Price 1</td>
    <td>Date 1</td>
    <td>Location 1</td>
</tr>
<tr>
    <td>2</td>
    <td>Name<a>Name 2</a></td>
    <td>Year 2</td>
    <td>KM 2</td>
    <td>Color 2</td>
    <td>Price 2</td>
    <td>Date 2</td>
    <td>Location 2</td>
</tr>
</tbody>



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ