使用 jsoup 库解析 html 元标记

2022-09-03 01:05:11

刚刚开始探索Jsoup库,因为我将把它用于我的一个项目。我尝试谷歌搜索,但我找不到可以帮助我的确切答案。这是我的问题,我有一个带有元标签的html文件,如下所示

<meta content="this is the title value" name="d.title">
<meta content="this is the description value" name="d.description">
<meta content="language is french" name="d.language">

还有一个像这样的java pojo,

public class Example {
    private String title;
    private String description;
    private String language;

    public Example() {}

    // setters and getters go here
} 

现在我想解析html文件并提取d.title内容值,并将其存储在“内容”的Example.title和d.description值中,并存储在Example.description中,依此类推。

我通过阅读jsoup食谱所做的是一些想法,

Document doc = Jsoup.parse("test.html");
Elements metaTags = doc.getElementsByTag("meta");

for (Element metaTag : metaTags) {
    String content = metaTag.attr("content");
    String content = metaTag.attr("name");
}

这将要做的是遍历所有元标记,获取其“内容”和“名称”属性的值,但我想要的是获取“内容”属性的值,其“名称”属性说“d.title”,以便我可以将其存储在示例.title中

更新:下面的@P.J.Meisch答案实际上解决了这个问题,但这对我的喜好来说代码太多了(试图避免做同样的事情)。我的意思是,我认为有可能做这样的事情

String title = metaTags.getContent(“d.title”)

其中d.title是“name”属性的值,这样它将减少代码行,我还没有找到这样的方法,但也许这是因为我对jsoup还很陌生,这就是为什么我问。但是,如果这样的方法不存在(如果它确实存在,那会很好,它使生活更轻松),我会选择P.J.Meisch说。


答案 1

好的,所有的代码:

Document doc = Jsoup.parse("test.html");
Elements metaTags = doc.getElementsByTag("meta");

Example ex = new Example();

for (Element metaTag : metaTags) {
  String content = metaTag.attr("content");
  String name = metaTag.attr("name");

  if("d.title".equals(name)) {
    ex.setTitle(content);
  }
  if("d.description".equals(name)) {
    ex.setDescription(content);
  }
  if("d.language".equals(name)) {
    ex.setLanguage(content);
  }
}

答案 2

回答您更新的问题:这在jsoup中是不可能的,因为jsoup文档只是反映了html文档的xml / dom结构。你将不得不迭代自己对meta,但你可以做这样的事情:

Document doc = Jsoup.parse("test.html");

Map<String, String> metas = new HashMap<>();
Elements metaTags = doc.getElementsByTag("meta");

for (Element metaTag : metaTags) {
  String content = metaTag.attr("content");
  String name = metaTag.attr("name");
  metas.put(name, content);
}

Example ex = new Example();
ex.setTitle(metas.get("d.title"));
ex.setDescription(metas.get("d.description"));
ex.setLanguage(metas.get("d.language"));