【问题标题】:Getting the <ul> <li> and <b> tags in htmlAgilityPack VB.NET在 htmlAgilityPack VB.NET 中获取 <ul> <li> 和 <b> 标记
【发布时间】:2014-05-10 23:03:47
【问题描述】:

老实说,我不知道该怎么做,而且我很困惑。我的代码可能不值得分享,但我会尽力提出问题。

<div class="pricing-table">
    <div class="span4">
        <div class="plan">
            <h3>PPTP <span>$0</span></h3>
            <ul>
                <li><b>IP:</b> " (hidden)"</li>
                <li><b>Username:</b> " Guest"</li>
                <li><b>Password:</b> " (hidden)"</li>
                <li><b>Unlimited</b> " Bandwidth"</li>
                <li><b>Torrents</b> " Allowed"</li>
                <li><b>No</b> " Logging"</li>
            </ul>
        </div>
    </div>
</div>

(这是第二个)

<div class="span4">
    <div class="plan most-popular">
        <h3>Open<span>$0</span></h3>
        <div class="plan-ribbon-wrapper">
            <div class="plan-ribbon">
                Popular
            </div>
        </div>
        <ul>
            <li><b>Username:</b> user</li>
            <li><b>Password:</b> (hidden)</li>
            <li><b>TCP</b> 80, 443</li>
            <li><b>UDP</b> 53, 40000</li>
            <li><b>Unlimited</b> Bandwidth</li>
            <li><b>Torrents</b> Allowed</li>
            <li><b>No</b> Logging</li>
        </ul><a class="btn btn-large btn-primary" href=
        "%20(hidden)">Download</a>
    </div>
</div>
<ul>
    <li><b>Username:</b> user</li>
    <li><b>Password:</b> (hidden)</li>
    <li><b>TCP</b> 80, 443</li>
    <li><b>UDP</b> 53, 40000</li>
    <li><b>Unlimited</b> Bandwidth</li>
    <li><b>Torrents</b> Allowed</li>
    <li><b>No</b> Logging</li>
</ul>

使用此 HTML 代码,我想复制用户名和密码并将其放入表单的标签中。

这是我的代码

Imports HtmlAgilityPack
Public Class Form1
Dim Prev_Pass, Prev_User, Currt_Pass, Currt_User, Info
Dim counter As Integer
Dim web As New HtmlWeb()
Dim htmldoc As HtmlAgilityPack.HtmlDocument = New HtmlAgilityPack.HtmlDocument
Dim htmlnodes As HtmlAgilityPack.HtmlNodeCollection = Nothing
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    htmldoc = web.Load("website")
    htmlnodes = htmldoc.DocumentNode.SelectNodes("//div[@class=""pricing-table""]")
    For Each node As HtmlAgilityPack.HtmlNode In htmlnodes
        Dim releaseNode = node.SelectSingleNode("//div[@class=""plan most-popular""]")
            Info = releaseNode.SelectSingleNode("//ul/li/b[contains(text(), 'Username: ')]").InnerText
    Next
    Label3.Text = Info
End Sub
End Class

【问题讨论】:

  • 请包含 完整 HTML 摘录。
  • 谢谢老兄。我针对您在问题的第一个修订版中提供的隔离段为您编写了一些代码。让我知道它是否适合您。
  • 这里让我用两个表更新整个 HTML 代码,以便您可以编辑我的代码。

标签: .net vb.net html-agility-pack


【解决方案1】:

考虑以下注释:

<li>
    <b>Username:</b> <!-- Use XPath to obtain this element. -->
    " user" <!-- This is the next sibling. -->
</li>

记住这些注释:

您可以像之前那样使用 XPath 获取 &lt;b&gt; 元素,然后通过 NextSibling 属性访问用户名或密码文本,如下所示:

Dim username = 
    htmldoc.DocumentNode.SelectSingleNode(
        "//ul/li/b[text()='Username:']").NextSibling.InnerHtml

Dim password =
    htmldoc.DocumentNode.SelectSingleNode(
        "//ul/li/b[text()='Password:']").NextSibling.InnerHtml

如果您想访问元素的第二次出现而不是第一次出现,那么您应该使用更具体的 XPath 或使用 SelectNodes 并通过 获取位于第二个索引处的元素像这样的索引器

Dim username =
    htmldoc.DocumentNode.SelectNodes(
        "//ul/li/b[text()='Username:']")(1).NextSibling.InnerHtml

【讨论】:

  • 这有效,但让我更新我的问题,因为该网站上有两个不同的表,其中包含用户名,当我这样做时,它会在网站上找到包含用户名的第一件事。第一个用户名不是我想要的。
  • @Neckup4 更新了我的答案。这是你想要的吗?
  • 没有考虑 InnerHtml 而不是 InnerText。我现在不在电脑旁,回来时必须测试一下。
  • @Neckup4 好的。我要睡觉了,告诉我情况如何。
  • 工作就像一个魅力感谢您的帮助。我一定会在代码的推荐部分中引用您。哈哈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多