【问题标题】:HtmlAgilityPack - Nothing displays in the textboxHtmlAgilityPack - 文本框中不显示任何内容
【发布时间】:2017-12-09 04:35:35
【问题描述】:

我有一个带有文本框的 Windows 窗体,该代码假设使用我通过 chromes 开发人员工具获得的 xpath 从网站中提取信息并将其显示在所述文本框中。

问题是当我运行程序时,文本框中没有显示任何内容。我不确定用于获取信息的代码是否错误,或者我用于显示所述信息的代码是否错误。请注意此代码使用 HtmlAgilityPack。

这里是有问题的代码:

private void richTextBox1_TextChanged(object sender, EventArgs e)
    {
        string Url = "https://apps.ko.com/aami/iguest/default.asp";
        HtmlWeb web = new HtmlWeb();
        HtmlAgilityPack.HtmlDocument doc = web.Load(Url);

        string username = doc.DocumentNode.SelectNodes("/html/body/center/div/table/tr[1]/td[2]/strong")[0].InnerText;
        string password = doc.DocumentNode.SelectNodes("/html/body/center/div/table/tr[2]/td[2]/strong")[0].InnerText;
        string summary = doc.DocumentNode.SelectNodes("/html/body/center/div/table/tr[4]")[0].InnerText;


        richTextBox1.Text = "User Name: " + username + " | Password: " + password + " | Summary: " + summary;

    }

在内网页面上列出了一个用户名和密码,我正在尝试从网页中提取它并在文本框中显示它,只要这个应用程序在域机器上运行它应该能够访问页面并显示所需信息。我没有尝试登录任何东西,只是从网页中提取一些文本。

没有人可以看到该页面,因为您不在只能访问该页面的域中。

这里是 HTML 页面,出于安全原因,代码中的网址已更改。

<body>
<div style="background-image:url(intranet.com/images/headergraphic_repeat_tile.jpg); background-repeat:repeat-x; margin-top:0px; margin-left:0px; width:100%; height:118px; padding:0px;">
<img src="https://intranet.com/iguest/images/headergraphic_extended.jpg" align="right">
</div>
<center>
<div style="width:390px; padding:20px; ">
    <h2 align="center">Guest Wireless Access</h2>
    <p align="left">Guests may access the wireless service by using the log-in <br>credentials below. <br>
      <br>
    </p>
  <table width="360" align="left" cellpadding="4" cellspacing="0">
    <tbody><tr>
      <td width="63">User ID:</td>
      <td><strong>KOGUEST</strong></td>
    </tr>
    <tr>
      <td>Password:</td>
      <td><strong><span id="iguestpw">P@ssword</span></strong> <font size="-2">&nbsp;&nbsp;(Password is case-sensitive.)</font></td>
    </tr>
    <tr>
    	<td colspan="2" align="center"><font size="-2">  The password is updated once a week on<br> Saturday at midnight EST.<br></font></td>
    </tr>
    <tr>
    	<td colspan="2"><br><br><p align="left"><a href="https://partner.intranet.com/sites/kooffice/training/documentation/guest wireless access_instructions for connecting.doc" target="_blank">Print  instructions</a> for your guest.<!--  or <a href="https://partner.intranet.com/sites/kooffice/training/i want to/courtesy wireless access.aspx" target="_blank">visit DWP</a> to learn more.--></p></td>
    </tr>
    
  </tbody></table>
  </div>
  </center>
</body>

【问题讨论】:

  • 使用该 Html,您的 xpath 将丢失 tbody。在table 标签内,有一个tbody 标签,表格的行在tbody 内。例如,第一个 xpath 应该是 /html/body/center/div/table/tbody/tr[1]/td[2]/strong
  • 我读到了一些错误地添加了 tbody 的地方,但是我使用 chrome 得到了那个 xpath,所以它可能是错误的,我不知道如何编写我自己的 xpath
  • 在 Firefox 中,您右键单击一个元素,然后按“检查”。然后右键单击 Html 标签并复制 xpath。您还可以使用 $x("my xpath here") 在控制台中缩短和测试 xpath。这个想法是写像//td[text()='User ID:']/following-sibling::td/strong 这样的东西而不是完整路径。注意开头的双斜杠//。有了这个,它会在任何地方找到它。 Chrome 检查工具也不错。

标签: c# xpath visual-studio-2017 richtextbox html-agility-pack


【解决方案1】:

您正在复制从浏览器获得的 xpath - 这是非常不可靠的。而且我不知道网站的 HTML 是否因地区而异。但我没有“强”标签或“中心”标签。

做一个不依赖于您从浏览器获得的 xpath 的正确 xpath - 它们很容易发生变化,并且如果发生小的变化会破坏您的程序(已经通过 xpath 在我的端不起作用的事实证明)。做一个简单的很容易。因为您现在所拥有的并不能清楚地表明您想要什么,而依赖于标签属性和内容的 xpath 则可以。

还要扩展您的后续问题,因为我已经知道您要做什么...您不能只使用 HtmlAgilityPack 输入您的用户名和密码,然后登录。您可以分析使用 Fiddler 的 webpackets 并复制您的登录方式。或者你可以走更简单的路线,将 Selenium 与 Phantomjs 等无头浏览器一起使用。

最后。当你让你的 xpaths 看看 PAGE SOURCE 时。不要检查元素。页面源代码表示加载到您的 HtmlDocument 中的 HTML。如果您检查元素,您会在站点上的某些步骤发生后获得源代码(例如,如果站点依赖于 JS og ajax 来更新内容)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-10
    • 2019-03-19
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多