私は現在、HTTP リクエストと webBrowser コントロールを使用するC# ライブラリを開発しています。私のライブラリはWinDevプログラムで使用され、WinDev アプリケーションと Web プレートフォーム (agenda.ch) の間の直接リンクを作成します。少し WebScraping を使用する必要があったため、最初に HtmlAgilityPack を使用して開始し、それで問題なく動作しましたが、WinDev でライブラリを実行すると、HtmlAgilityPack HtmlDocument がインスタンス化されるとライブラリが突然停止します...その後、HtmlAgilityPack を削除することにし、必要な情報を取得するには、System.Windows.Forms HtmlElementクラスを直接使用します。
ここで問題が発生します。 foreach ループを使用してドキュメント内の各 HtmlElement をチェックする場合、そのクラス値をチェックするために GetAttribute() 関数しか使用できません。しかし、何らかの理由で返される値は常に空です。私はさまざまなテストを行いましたが、どれも論理的な応答を示していません。そのため、StackOverflow に目を向けました。id などの別の属性名を使用してみましたが、うまくいきました。クラス属性値を回復できない理由がわかりません。
private void RecoverClients(HtmlDocument source)
{
HtmlDocument doc = source;
HtmlElementCollection clientSection = doc.GetElementsByTagName("DIV");
HtmlElement clients;
foreach (HtmlElement element in clientSection)
{
// Tests
var test = element.GetAttribute("class"); // Always empty
var test2 = element.GetAttribute("id"); // When has id attribute, works
if (element.GetAttribute("class") == "customer_list") // The code I use
{
clients = element;
break;
}
}
これは、WebBrowser によって回復され、RecoverClients 関数に送信される HTML コードの一部です。
<DIV class="customer_list">
<UL>
<LI data-id="xxxx"><
A href="#customers/xxxx" data-action="show">
<STRONG>ClientName</STRONG>ClientSirName<BR><SMALL>client1@tech.ch</SMALL>
</A>
</LI>
<LI data-id="xxxx"><
A href="#customers/xxxx" data-action="show">
<STRONG>ClientName</STRONG>ClientSirName<BR><SMALL>client2@tech.ch</SMALL>
</A>
</LI>
</UL>
</DIV>
この種の問題に既に遭遇した場合、またはクラス名で HtmlElement を回復するための適切な手法を使用していない場合はお知らせください。
HtmlAgilityPack を使用できないことに注意してください。以前は問題なく動作していましたが、ライブラリが WinDev に実装されると問題が発生します...