【问题标题】:Build a text from html using xpath使用 xpath 从 html 构建文本
【发布时间】:2011-09-22 15:04:20
【问题描述】:

我从服务器收到如下所示的 html。我通过使用 XPath exp @"//text()" 并将“nodeContent”值附加到字符串来重建文本部分。代码是这样的:

for (int i=2; i<[resultXPathQuery count]; i++) {
    [mytext appendString:[[resultXPathQuery objectAtIndex:i] objectForKey:@"nodeContent"]];
    [mytext appendString:@"\n"];
}

我得到:

Line 1
line 2
line 3 
line 4

如何在考虑空节点的情况下构建文本部分?
我想获得:

Line 1
line 2

line 3



line 4

<html><head><title>A title</title><style type="text/css">
ol{margin:0;padding:0}p{margin:0}
.c0{font-size:12pt;background-color:#ffffff;font-family:Times New Roman}
.c6{width:432.0pt;background-color:#ffffff;padding:72.0pt 90.0pt 72.0pt 90.0pt}
.c7{color:#aaaaaa;font-family:Times New Roman}
.c3{color:#0000ee;text-decoration:underline}
.c5{color:inherit;text-decoration:inherit}
.c2{font-size:12pt;font-family:Times New Roman}
.c4{height:12pt}.c1{direction:ltr}
body{color:#000000;font-size:12pt;font-family:Times New Roman}
h1{padding-top:12.0pt;line-height:1.0;text-align:left;color:#000000;font-size:24pt;font-  family:Times New Roman;font-weight:bold;padding-bottom:12.0pt}
h2{padding-top:11.25pt;line-height:1.0;text-align:left;color:#000000;font-size:18pt;font-family:Times New Roman;font-weight:bold;padding-bottom:11.25pt}
h3{padding-top:12.0pt;line-height:1.0;text-align:left;color:#000000;font-size:14pt;font-family:Times New Roman;font-weight:bold;padding-bottom:12.0pt}
h4{padding-top:12.75pt;line-height:1.0;text-align:left;color:#000000;font-size:12pt;font-family:Times New Roman;font-weight:bold;padding-bottom:12.75pt}
h5{padding-top:12.75pt;line-height:1.0;text-align:left;color:#000000;font-size:9pt;font-family:Times New Roman;font-weight:bold;padding-bottom:12.75pt}
h6{padding-top:18.0pt;line-height:1.0;text-align:left;color:#000000;font-size:8pt;font-family:Times New Roman;font-weight:bold;padding-bottom:18.0pt}</style>
</head>
<body class="c6">
<p class="c1"><span class="c2">A title</span></p>
<p class="c1 c4"><span class="c2"></span></p>
<p class="c4 c1"><span class="c2"></span></p>
<p class="c1"><span class="c7">Line 1</span></p>
<p class="c1"><span class="c7">line 2</span></p>
<p class="c4 c1"><span class="c7"></span></p>
<p class="c1"><span class="c7">line 3</span></p>
<p class="c4 c1"><span class="c7"></span></p>
<p class="c4 c1"><span class="c7"></span></p>
<p class="c3 c2"><span class="c1"></span></p>
<p class="c1"><span class="c7">line 4</span></p>
</body></html>

编辑

真的,我注意到 html 可能更“复杂”,因此选择所有 span 元素或 p 元素是不够的。此外,更多的 span 元素可以出现在同一个 p 元素中,所以在这种情况下,我不必在我的字符串中创建新行。

这是一个更复杂的返回 html 的主体:

<body class="c13">
<p class="c5"><span>gfgfgfd</span></p>
<p class="c1"><span></span></p>
<p class="c5 c10"><span>ghhgfhgfh hghg hgkfhjgk ghjgkh ghjgjhg gjhjg gjhj gjhgjhgjhg gfhjkgjg jghjgfhjgf fghfj jghfj fghjggf jhgjgjgkjg</span></p>
<p class="c1 c10"><span></span></p>
<p class="c4"><span>gfgfgfd</span></p>
<p class="c4"><span>f</span></p>
<p class="c4">
     <span>gfdgfdg</span>
     <span class="c7">hg</span></p>
<p class="c4"><span class="c7">ghgfhgfh</span></p>
<p class="c4"><span class="c7">gfhgfhgf</span></p>
<p class="c5">
     <span class="c7">hgfh </span>
     <span class="c0">gfdgfg</span></p>
<p class="c5"><span class="c0">fgfdgfdgfd</span></p>
<p class="c5"><span class="c0">gdfgdfgfd</span></p>
<p class="c5"><span class="c0">gfgf</span></p>
<p class="c1"><span class="c0"></span></p>
<p class="c5"><span class="c0 c8"><a class="c12" href="http://www.google.com">www.google.com</a></span></p>
<p class="c1"><span class="c0"></span></p>
<p class="c5"><span class="c0">fgfdgfdg</span></p>
<p class="c5">
     <span class="c0">fgffgfdgfg</span>
     <span class="c0 c11">gfgfdgfd fgd fd</span>
     <span class="c0">fdgfdg</span></p>
<p class="c5"><span class="c0">fgfdgfdgf</span></p>
<p class="c5"><span class="c0">gfd</span></p>
<p class="c5"><span class="c0">gfgf</span></p>
<p class="c1"><span class="c0"></span></p>
<p class="c5"><span class="c0 c8"><a class="c12" href="mailto:….">...</a></span></p>
<p class="c1"><span class="c0"></span></p>
<ol class="c9" start="1">
<li class="c3"><span class="c0">gfgfd</span></li>
<li class="c3"><span class="c0">gfdgfd</span></li>
<li class="c3"><span class="c0">gfdgfd</span></li>
<li class="c3"><span class="c0">gdfgfd</span></li>
</ol>
<p class="c1"><span class="c0"></span></p>
<p class="c5"><span class="c0">hgfhgf</span></p>
<p class="c5"><span class="c0">gfhgfh</span></p>
<p class="c5"><span class="c0">hgfhgf</span></p>
<p class="c1"><span class="c0"></span></p>
<ol class="c2" start="1">
<li class="c3"><span class="c0">gfhg</span></li>
<li class="c3"><span class="c0">hgfh</span></li>
<li class="c3"><span class="c0">hgf</span></li>
</ol>
<p class="c1"><span class="c0"></span></p>
<h1 class="c5 c15"><a name="h.kafwflosthlg"></a><span class="c7 c14">hgfhgfh</span></h1>
<p class="c1"><span class="c6"></span></p>
<p class="c1"><span class="c6"></span></p>
<p class="c1"><span class="c6"></span></p>
</body>

我需要一个 XPath 表达式来选择 p、h1、h2、...、h6、li 元素,并以正确检测新行和空行的方式考虑内部文本部分。

【问题讨论】:

    标签: xpath


    【解决方案1】:

    对于上面的示例,您可以使用//span,它将返回所有&lt;span&gt; 元素,而不管它们的内容如何。看起来您正在执行一些其他过滤,因为 //text() 还应该从 &lt;title&gt; 和第一个 &lt;span&gt; 返回您的 CSS 块和 A Title

    【讨论】:

    • 是的,在 for 语句中 var i 从 2 开始,所以我省略了内联 css 和标题。我必须进行一些其他尝试来检查服务器(GDocs)是否总是使用这样的表单。以防万一,我如何将 //span 与 //text() 一起使用?此外,您知道如何获取其中不包含其他元素的 span 元素,例如获取所有不包含 img 元素的 span 元素吗?
    • @Objnewbie - @"nodeContent" 应该返回节点的文本值(在本例中为 the text value of span). You will have to experiment to see if it is an empty string or nil when there is no text value. To get a only the span that don't have img elements use something like //span[not(img)]`。
    • 谢谢。我注意到返回的 html 可能比上面的(第一个)更“复杂”,正如您在第二个示例中看到的那样。
    【解决方案2】:

    我宁愿为此使用正则表达式:

    1. 抓取正文标签之间的所有内容(您也可以使用 XPath 来实现)
    2. &lt;/p&gt; 替换为&lt;/p&gt;\n
    3. 剥离标签

    【讨论】:

      猜你喜欢
      • 2015-07-12
      • 1970-01-01
      • 1970-01-01
      • 2019-01-25
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 2020-07-12
      相关资源
      最近更新 更多