【问题标题】:Get all text content between tags from a URL?从 URL 获取标签之间的所有文本内容?
【发布时间】:2015-11-02 05:31:23
【问题描述】:

通过 URL 链接。例如:http://www.engineersireland.ie/home.aspx

我可以使用 java.net.URL 或 Jsoup 中内置的 java 来读取它们。

然后,我需要提取标签后标签之间的所有文本内容。

标签内会有标签。我只需要中间的文字。

例如:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     <head id="head"><title>
        Engineers Ireland - Home
     </title><meta http-equiv="content-type" content="text/html; charset=UTF-8" /> 
    <meta http-equiv="pragma" content="no-cache" /> 
    <meta http-equiv="content-style-type" content="text/css" /> 
    <meta http-equiv="content-script-type" content="text/javascript" /> 

    <link href="/favicon.ico" type="image/x-icon" rel="shortcut icon"/> 
    <link href="/favicon.ico" type="image/x-icon" rel="icon"/>
<body>
<div class="module-content">

        <p id="1">Members can login for access to exclusive content, event booking, shop discounts and more...</p>

            <fieldset>
                <legend>Your Login Details</legend>
                <div class="formline">
                    <label for="1" id="1">Your Membership Number</label>
                    <input name="1" type="text" id="1" title="Your Membership Number" class="login-username clearlabel" />
                    <span id="1e" class="ErrorLabel" style="display:none;">Enter your membership number</span>
                </div>
                <div class="formline">
                    <label for="1" id="adasdasd">Password</label>
                    <input name="asdasd" type="password" id="dfbsdf" title="Password" class="login-password clearlabel" />
                    <span id="drthd" class="ErrorLabel" style="display:none;">Enter your password</span>
                </div>
                <div class="formline">
                    <input name="aseresrr" type="checkbox" id="bstg" class="login-remember" />
                    <label for="ryjmf" id="asrats" class="remember">Remember Me</label>

                    <div class="button grey">
                        <input type="submit" name="fgn" value="LOGIN" onclick="sdf;, false, false))" id="sdfsdf" />
                    </div>
                </div>

            </fieldset>
        <ul class="arrow">
            <li><a href="/site/reset-password.aspx">Forgot your password?</a></li>
            <li><a href="/membership/apply.aspx">Haven't registered yet?</a></li>
        </ul>
    </div>
</body>
</html>

从这段 html 代码中,我只需要:

Your Membership Number
Enter your membership number
Password
Enter your password
Remember Me

还有一点,

Keep in mind, the tag names and the number of tag are always random depend on the web page iteself.

有什么帮助吗?通过使用 Jsoup 还是 java?谢谢

【问题讨论】:

  • 你有没有尝试过?你看过 JSoup 文档吗?对于你想要什么文本和你不想要什么文本有什么规则?它看起来像&lt;fieldset/&gt; 中所有&lt;label/&gt;&lt;span/&gt; 元素的文本内容,仅此而已?这些真的是要求吗?例如,为什么会排除 &lt;p/&gt; 标记中的文本或底部的链接?
  • 是的。我查了 Jsoup 的文档。现在正在研究它。对于上面的示例,它只是一个随机的。我需要 之后的任何标签之间的所有文本。标签可能包含标签,但我需要所有这些标签层中间的文本。谢谢
  • 如果您仍在研究,只需向下滚动即可。我发布了一个工作示例。

标签: java html dom html-parsing jsoup


【解决方案1】:

通过以下内容,您可以通过将正确的 CSS 查询传递给 getStringsFromUrl 方法来指定要从文档的哪个部分提取文本。要搜索整个文档,请传入 null。

import org.jsoup.Jsoup;
import org.jsoup.helper.StringUtil;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Node;
import org.jsoup.nodes.TextNode;
import org.jsoup.select.Elements;
import org.jsoup.select.NodeVisitor;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class JSoupTest {
    /*
     Outputs:
        Members can login for access to exclusive content, event booking, shop discounts and more...
        Your Login Details
        Your Membership Number
        Enter your membership number
        Password
        Enter your password
        Remember Me
        Forgot your password?
        Haven't registered yet?
     */
    public static void main(String[] args) throws IOException {
        String url = "http://localhost/test.html";
        List<String> strings = getStringsFromUrl(url, null);
        for(String string : strings) {
            System.out.println(string);
        }
    }

    private static List<String> getStringsFromUrl(String url, String cssQuery) throws IOException {
        Document document = Jsoup.connect(url).get();
        Elements elements = StringUtil.isBlank(cssQuery)
                ? document.getElementsByTag("body")
                : document.select(cssQuery);

        List<String> strings = new ArrayList<String>();
        elements.traverse(new TextNodeExtractor(strings));
        return strings;
    }

    private static class TextNodeExtractor implements NodeVisitor {
        private final List<String> strings;

        public TextNodeExtractor(List<String> strings) {
            this.strings = strings;
        }

        @Override
        public void head(Node node, int depth) {
            if (node instanceof TextNode) {
                TextNode textNode = ((TextNode) node);
                String text = textNode.getWholeText();
                if (!StringUtil.isBlank(text)) {
                    strings.add(text);
                }
            }
        }

        @Override
        public void tail(Node node, int depth) {}
    }
}

【讨论】:

  • 先谢谢你的回答。在这种情况下,它确实适用于我给出的示例。但在实际情况下,我们不知道 中有多少标签,也不知道文本周围有多少层标签。但我需要的只是文本,程序只接受一个简单的 URL。例如,en.wikipedia.org/wiki/Engineer 将是 Jsoup.connect("") 中的输入;然后,将返回所有需要的文本。
  • 好吧,您的问题表明您只想要文档中实际字符串的子集。如果你想要所有的字符串,只需用 document.body() 替换 document.select() 调用,它将返回所有内容
  • 已编辑以更准确地展示您正在寻找的内容。请注意,它返回的字符串比您最初在主题问题中声明的字符串多。
  • 它似乎工作。我将研究您的代码并进行修改以适应我的程序。再次感谢
【解决方案2】:

在 java 中使用 HtmlUnit 库,以便您可以找到您选择的标签内容。

请访问以下链接:

http://htmlunit.sourceforge.net/gettingStarted.html

【讨论】:

  • 标签名是随机的。我需要的只是标签之间的文本。无论文本外有多少标签层。
  • 您使用的是 HTML 标签还是其他标签?请告诉我。
  • 如果您只想解析 html,那么 HTMLUnit 肯定会帮助您。我前几天用过。
  • 不要只发布链接答案。链接帐篷会破坏,这将使您的答案无效。而是根据链接中的文章创建简单的解决方案,并将链接作为更多信息的来源。更多信息请访问:are-answers-that-just-contain-links-elsewhere-really-good-answers
  • "...并作为答案发布" 我只是希望您的意思是"...并在 in 这个答案中发布",因为当您没有理由创建新帖子时可以简单地[edit]这个:)
猜你喜欢
  • 2021-10-09
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 2017-08-15
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多