使用Jsoup按顺序获取数据

时间:2017-06-05 22:31:18

标签: java android web-scraping jsoup

我正在尝试从网上按顺序从html获取数据。 Html代码如下:

<div class="text">

First Text
<br>
<br>
<div style="margin:20px; margin-top:5px; ">
	<table cellpadding="5">
	<tbody><tr>
		<td class="alt2">
				<div>
					Written by <b>excedent</b>
				</div>
				<div style="font-style:italic">quote message</div>
		</td>
	</tr>
	</tbody></table>
</div>Second Text<br>
<br>
<img class="img" src="https://developer.android.com/_static/images/android/touchicon-180.png"><br>
<br>
Third Text
</div>

我想要做的是创建一个Android布局抓取html,但我需要保留元素的顺序。在这种情况下:

  
      
  1. TextView =&gt;第一文
  2.   
  3. TextView =&gt;引用消息
  4.   
  5. TextView =&gt;第二篇文字
  6.   
  7. ImageView =&gt; IMG
  8.   
  9. TextView =&gt;第三文
  10.   

当我尝试按顺序获取html值时出现问题,使用JSoup我得到一个带有“First Text Second Text Third Text”的字符串和Element.ownText,最后是img,结果:

  
      
  1. TextView =&gt;第一文本第二文本第三文本
  2.   
  3. TextView =&gt;引用消息
  4.   
  5. ImageView =&gt; IMG
  6.   

如何才能按顺序获取数据?

提前致谢

3 个答案:

答案 0 :(得分:0)

您可以将html解析为html节点列表。节点列表将保留DOM顺序并提供您想要的内容。

检查parseFragment方法:

此方法将为您提供节点列表。

答案 1 :(得分:0)

试试这个。

::

    Plain old text

输出:

    String html = ""
        + "<div class=\"text\">"
        + "    First Text"
        + "    <br>"
        + "    <br>"
        + "    <div style=\"margin:20px; margin-top:5px; \">"
        + "    <table cellpadding=\"5\">"
        + "        <tbody><tr>"
        + "            <td class=\"alt2\">"
        + "                <div>"
        + "                    Written by <b>excedent</b>"
        + "                </div>"
        + "                <div style=\"font-style:italic\">quote message</div>"
        + "            </td>"
        + "            </tr></tbody>"
        + "    </table>"
        + "    </div>Second Text<br>"
        + "        <br>"
        + "        <img class=\"img\" src=\"https://developer.android.com/_static/images/android/touchicon-180.png\"><br>"
        + "        <br>"
        + "        Third Text"
        + "    </div>";
    Document doc = Jsoup.parse(html);
    List<String> rootTexts = doc.select("div.text").first().textNodes().stream()
        .map(node -> node.text().trim())
        .filter(s -> !s.isEmpty())
        .collect(Collectors.toList());
    System.out.println(rootTexts);

答案 2 :(得分:0)

这个答案有点晚了,但是做你想做的正确方法是这个。对于最外层的<div>,您可以使用Element.children()来代替使用Element.childNodes()来获得子元素。

Element.children()仅返回子Elements,其中不包含文本。

Element.childNodes()返回所有子节点,其中包括TextNodesElements

此解决方案对我有用。