【问题标题】:Finding the XPath for a few rows in a Table?查找表中几行的 XPath?
【发布时间】:2013-05-10 09:59:09
【问题描述】:

我目前正在尝试使用 xpath 查询从 html 站点中提取特定数据,但在提取特定部分时遇到问题。

使用//div[@id='main']/h2 作为我的 xpath 查询,我可以使用以下内容提取“查看当前”文本:

exampleSite.title = [[element firstChild] content];

不过,我还想加入以下内容:

1. <b>5/9/2013<nbsp><nbsp> 10:58:45 PM</b>
2. <b>6.32</b>
3. <b>5  Total Points</b>
4. <b>3.72</b>

到目前为止,我得到了这个://div[@id='main']/table[@class='bodytext']/tr,但这就是我卡住的地方。任何帮助将不胜感激!谢谢!

这是我试图抓取的 html:

<div id="main">
<h2>View Current</h2>

      <table width="96%" border="0" cellpadding="4" cellspacing="0" bordercolor="#eeeeee" align="center" height="276" valign="top" class="bodytext">
        <tr valign="top" >
          <td colspan = 2 height="13" valign="top" align="left" width="54%" class="headerblue" >Balances <br>
          </td>
        </tr>
        <tr valign="top" > 
          <td colspan = 2 height="13" valign="top" align="left" width="54%" class="text" >Balances 
            as of: <b>5/9/2013<nbsp><nbsp> 10:58:45 PM</b></td>
        </tr>
        <tr valign="top" > 
          <td colspan = 2 height="13" valign="top" align="left" width="46%" class="text" >Account 
            Number: <b>101010123</b></td>
        </tr>
        <tr valign="top" > 
          <td colspan = 2 height="13" valign="top" align="left" width="46%" class="text" ></td>
        </tr>

        <tr valign="top" > 
          <td height="13" valign="top" align="left" width="46%" class="text" >Example Card Amount: 
            <b>6.32</b></td>
<td height="13" valign="top" align="left" width="46%" class="text" ><a href="balance.asp?">View Details</a></td>
        </tr>

        <tr valign="top" > 
          <td height="13" valign="top" align="left" width="46%" class="text" >Example Dining Plans:<b>5  Total Points</b>

</td>
<td height="13" valign="top" align="left" width="46%" class="text" ><a href="balance2.asp?">View Details</a></td>
        </tr>

        <tr valign="top" > 
          <td height="13" valign="top" align="left" width="46%" class="text" >Credit For Printing: 
            <b>3.72</b></td>
<td height="13" valign="top" align="left" width="46%" class="text" ><a href="balance1.asp?">View Details</a></td>
        </tr>

          <td colspan = 2 height="13" valign="top" align="CENTER"  class="text">For 
            questions contact Cashiers at<BR> (000)000-0011 or <a href="mailto:example@example.com">example@example.com</a></td>
        </tr>
        <tr valign="top"> 
          <td colspan = 2 height="13" valign="top" align="CENTER"  class="text" > 

<a href="balance1.asp">All Plan Usage for last 90 days is available here</a>
            </td>
        </tr>
        <tr valign="top"> 
          <td colspan = 2 height="13" valign="top" align="CENTER"  class="text" > 

<a href="balance.asp?pln=Full">All Usage for last 365 days is available here</a>
            </td>
        </tr>

      </table>



</div>

【问题讨论】:

    标签: html ios objective-c xpath hpple


    【解决方案1】:

    //div[@id='main']/table[@class='bodytext']/tr/td/b 应该为您提供表格单元格中所有&lt;b&gt;s 的列表。

    【讨论】:

    • 谢谢门尼。假设我有不同的标签。我如何能够将每个 文本具体分配给每个标签?假设我希望标签 1 有第 3 个 ,标签 2 有第一个 ,依此类推。
    • 您的意思是将&lt;b&gt;s 的内容映射到Objective-C 中的特定title 属性吗?我认为对于动态 HTML 结构,您必须使用封闭的 &lt;td&gt; 标记的内容来匹配它。如果您的 HTML 是静态的,您可以编写一个静态的NSDictionary 将索引映射到titles。编辑:您使用哪个类来解析 HTML?
    • 我正在使用 Hpple。此外,如果用户使用他们的卡/帐户,每个 中的实际文本也会发生变化。
    • @user1886754:我试图在我的回答中回答你的问题。如果您有任何问题,请告诉我!
    【解决方案2】:

    这是对 Mennny 答案的扩展,这实际上是正确的,因此您应该接受它。 我将尝试在 cmets 中回答您的其他问题:

    你的解析是这样的:(htmlData是我的演示数据)

    NSData *htmlData = [NSData dataWithContentsOfFile:[@"/Users/dennis/Desktop/demo.html" stringByStandardizingPath]];
    TFHpple *parser = [[TFHpple alloc] initWithHTMLData:htmlData];
    NSArray *bTags = [parser searchWithXPathQuery:@"//div[@id='main']/table[@class='bodytext']/tr/td/b"];
    

    之后,您将解析后的&lt;b&gt;tags 的内容放入NSMutableArray

    NSMutableArray *stringsInBTag = [[NSMutableArray alloc] initWithCapacity:0];
    for (TFHppleElement *element in bTags) {
        [stringsInBTag addObject:element.content];
    }
    

    你得到的是:(数组的记录输出)

    ( “2013 年 5 月 9 日”, 101010123, "6.32", "5 总分", “3.72” )

    现在您要设置标签:

    // Set label 1 to third <b>
    self.label1.text = stringsInBTag[2];
    
    // Set label 2 to first <b> 
    self.label2.text = stringsInBTag[0];
    

    【讨论】:

    • 谢谢你!这看起来真的很好!但是,我收到线程 1 错误:/ 只是为了不阻塞这个问题,我在这里打开了它stackoverflow.com/questions/16481907/…,并提供了有关您提供的示例的更多详细信息。感谢您的帮助!
    猜你喜欢
    • 2015-09-11
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2020-05-02
    相关资源
    最近更新 更多