HTMLAgilityPackを使用してHTMLオプション値を個別に選択する

c# html-agility-pack

質問

オプションリストの値を個々の項目として取得しようとしていますが、このコードはリスト全体を1つの要素にするだけです。私が使用しているコードは次のとおりです:

List<string> chapterTitles = new List<string>();
HtmlNode.ElementsFlags.Remove("option");
doc.LoadHtml(htmlContent);
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//select[@id='chap_select']/option"))
chapterTitles.Add(node.InnerText);

chapterTitlesの最初の要素は、(例えば)12個の値を持つオプションリストに対応するためにリストに12個の異なるエントリーがあるのではなく、オプション値のセット全体を持っています。

ここでは、私が解析しようとしているHTMLセグメントです:

<SELECT id=chap_select title="Chapter Navigation" Name=chapter onChange="self.location = '/s/5231611/'+ this.options[this.selectedIndex].value + '/Behind-Enemy-Lines-I-Light-Hammer';"><option  value=1 selected>1. Prologue<option  value=2 >2. Chapter One<option  value=3 >3. Chapter Two<option  value=4 >4. Chapter Three<option  value=5 >5. Chapter Four<option  value=6 >6. Chapter Five<option  value=7 >7. Chapter Six<option  value=8 >8. Chapter Seven<option  value=9 >9. Chapter Eight<option  value=10 >10. Chapter Nine<option  value=11 >11. Chapter Ten<option  value=12 >12. Chapter Eleven</select>

助言がありますか?

受け入れられた回答

HtmlAgilityPackはそのコードを本当にうまく解析していないようです。例えば、コード

<option  value=3 >3. Chapter Two<option  value=4 >...

本当にすべきだ

<option value="3">3. Chapter Two</option>
<option value="4">...

だから、私があなたにそれを解析するために提案するのは、以下のことです:

var doc = .. //Load the HTML code here.
foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//select[@id='chap_select']/option")) {
    chapterTitles.Add(node.NextSibling.InnerText);
}

主な2つの違い:

  1. 私はHtmlNode.ElementsFlags.Remove("option");を削除しHtmlNode.ElementsFlags.Remove("option");
  2. テキストはoptionノードの隣にある(内部の代わりに)ノードにありoption


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