【问题标题】:XPATH expression to retrieve this informartion inside <b> </b> <br/> tagsXPATH 表达式在 <b> </b> <br/> 标记内检索此信息
【发布时间】:2013-12-17 02:28:40
【问题描述】:

首先,我对 html 的了解还不够基本。

我有这段 html 代码:

    <div class="main_panel_sub">
        <p>
            <p>
                <b>Genre</b>: pop<br/>
                <b>Country</b>: USA<br />
                <b>Year</b>: 2013<br />
                <b>Audio codec</b>: MP3<br />
                <b>Riptype</b>: tracks<br />
                <b>Bitrate</b>: 320 kbps<br />
                <b>Playtime</b>: 01:06:44<br />
                <b>Size:</b> 153 MB<br />
                <b>Site:</b> 
                <a href='XXXXXXX'>XXXXXXX.com</a>
            </p>
        </p>

我正在使用库 HTMLAgilityPack,我想检索 GenreYear 值,我只需要知道正确的 XPath

这是我正在尝试使用的 XPATH,但我迷失了那些 &lt;b&gt; &lt;/b&gt; &lt;br/&gt;

Genre = node.SelectSingleNode("..//div[@class='main_panel_sub']/p/p/b[1]").InnerText
Year = node.SelectSingleNode("..//div[@class='main_panel_sub']/p/p/b[3]").InnerText

在上面的第一行代码中,我得到了字符串Genre,而不是流派值Pop

第二行我得到Year 字符串而不是2013

更新:

一个(有问题的)变化 DIV 示例:

<div class="main_panel_sub">
<p><p><b>Genre</b>: Synthpop<br />
<b>Year</b>: 2012<br />
<b>Audio codec</b>: MP3<br />
<b>Riptype</b>: tracks<br />
<b>Bitrate</b>: VBR~256 kbps<br />
<b>Playtime</b>: 00:29:21<br />
<b>Size:</b> 57 MB<br />
<b>Site:</b> <a href='http://xxxxxxxxxxxx.com'>xxxx.com</a></p>
</p>

以及我尝试使用的代码:

 Dim fields = (From field In node.SelectNodes("..//div[@class='main_panel_sub']//b")
              Let contentNodes = field.ParentNode.ChildNodes.SkipWhile(Function(e) Not e.Equals(field)).
                                 TakeWhile(Function(e) e.Equals(field) OrElse e.Name <> "b")
                                 Let content = [String].Concat(contentNodes.[Select](Function(e) e.InnerText))
                                 Select content.Split(":")).
                                        ToDictionary(Function(s) s(0).ToLower.Trim(), Function(s) s(1).Trim())

【问题讨论】:

    标签: c# html .net vb.net xpath


    【解决方案1】:

    解析这样的 html 是有问题的,因为它列出的属性不一致。所有领域都没有固定的模式。冒号有时在 b 标签内,并非所有字段都以 br 标签结尾(这是分隔每个字段的好方法。如果您对 html 的格式有任何影响,我会推动为每个字段提供单一一致的格式。或者至少将它们放在一个无序列表或其他东西中,以使选择字段更容易完成。

    基本上,您需要将所有字段及其内容分组并解析出这些组。说起来容易做起来难,但可行。

    var fields =
        (from field in node.SelectNodes("..//div[@class='main_panel_sub']//b")
        // group the nodes
        let contentNodes = field.ParentNode.ChildNodes
            .SkipWhile(e => e != field)
            .TakeWhile(e => e == field || e.Name != "b")
        // easier to parse as strings
        let content = String.Concat(contentNodes.Select(e => e.InnerText))
        select content.Split(':'))
        .ToDictionary(s => s[0].Trim(), s => s[1].Trim());
    var genre = fields["Genre"];
    var year = fields["Year"];
    

    【讨论】:

    • 是的,不幸的是,html 的格式不适合坚持纯粹的 HAP 方法。你必须混合才能完成你想要的。
    • #Jeff Mercado linq 方法不适用于这样的流派:&lt;p&gt;&lt;p&gt;&lt;b&gt;Genre&lt;/b&gt;: Synthpop&lt;br /&gt; 请问你能解决它吗?
    • 以什么方式失败?如果这是它的格式,它与您在问题中的示例没有太大不同,因此它应该起作用。你能否在你的问题中包括这个例子(完整的main_panel_sub div)?所以我可以看到需要改变的地方。
    • 我已经更新了我的问题,它引发了一个异常,我认为是因为“b”,我没有使用 C# 版本,我已将其翻译为 VB,但进行了任何修改(只是我我添加了 s(0).Tolower)
    • 有什么异常?我运行了你在那个 sn-p 上使用的相同的 VB 代码,对于那个例子来说很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    相关资源
    最近更新 更多