Jsoup 输出的哈希图
Hashmap of Jsoup output
我有一个 html 文件,它看起来像:
<html>
<body>
<h3>title 1</h3>
<a>'a paragraph here'</a>
<a>'a paragraph here'</a>
<a>'a paragraph here'</a>
<h3><b>title 2</b></h3>
<a>'a paragraph here'</a>
<a>'a paragraph here'</a>
<a>'a paragraph here'</a>
</body></html>
问题:Hashmap 将所有 <a>
标签存储在标题 1 和标题 2 下。而我想将每个 <h3>
标签存储为键,将以下 <a>
标签存储为其值.
其次,我得到的存储输出包括 <h3>
、<b>
和 <br>
等标签。我在哪里可以在此代码中实现 Html.frmHtml
以获得正确格式化的输出。
public HashMap<String, List<String>> CreateMas() throws IOException{
// TODO Auto-generated method stub
String name = "1.html";
InputStream is = getAssets().open(name);
Document doc = Jsoup.parse(is, "UTF-8", "http");
HashMap<String, List<String>> mas = new HashMap<String, List<String>>();
for( Element element : doc.select("h3") )
{
String main = element.toString();
\Toast.makeText(getApplicationContext(), main, Toast.LENGTH_LONG).show();
for( Element elemen : doc.select("a") )
{ List<String> subm = new ArrayList<String>();
String sub = elemen.toString();
subm.add(sub);
mas.put(main,subm);
}
}
我不明白您所说的格式正确的输出是什么意思,但我认为至少我可以帮助您解决问题的第一部分。这就是如何使用 h3 标签文本作为键,列表中的以下标签作为值来构建地图:
String html = ""
+"<html>"
+"<body>"
+"<h3>title 1</h3>"
+"<a>'a paragraph 1 here'</a>"
+"<a>'a paragraph 2 here'</a>"
+"<a>'a paragraph 3 here'</a>"
+"<h3><b>title 2</b></h3>"
+"<a>'a paragraph 4 here'</a>"
+"<a>'a paragraph 5 here'</a>"
+"<a>'a paragraph 6 here'</a>"
+"</body></html>";
Document doc = Jsoup.parse(html);
Elements as = doc.select("a");
String currentTitle = null;
Map<String,List<String>> mas = new LinkedHashMap<>();
for (Element a : as){
if ("h3".equals(a.previousElementSibling().tagName())){
currentTitle = a.previousElementSibling().text();
mas.put(currentTitle, new ArrayList<String>());
}
mas.get(currentTitle).add(a.text());
}
System.out.println(""+mas);
上面的程序使用 previousElementSibling()
方法来识别直接位于 a 元素之前的 h3 标签。剩下的应该很容易理解了。
请注意,我使用 LinkedHashMap 是为了 h3 标签的原始顺序。
我有一个 html 文件,它看起来像:
<html>
<body>
<h3>title 1</h3>
<a>'a paragraph here'</a>
<a>'a paragraph here'</a>
<a>'a paragraph here'</a>
<h3><b>title 2</b></h3>
<a>'a paragraph here'</a>
<a>'a paragraph here'</a>
<a>'a paragraph here'</a>
</body></html>
问题:Hashmap 将所有 <a>
标签存储在标题 1 和标题 2 下。而我想将每个 <h3>
标签存储为键,将以下 <a>
标签存储为其值.
其次,我得到的存储输出包括 <h3>
、<b>
和 <br>
等标签。我在哪里可以在此代码中实现 Html.frmHtml
以获得正确格式化的输出。
public HashMap<String, List<String>> CreateMas() throws IOException{
// TODO Auto-generated method stub
String name = "1.html";
InputStream is = getAssets().open(name);
Document doc = Jsoup.parse(is, "UTF-8", "http");
HashMap<String, List<String>> mas = new HashMap<String, List<String>>();
for( Element element : doc.select("h3") )
{
String main = element.toString();
\Toast.makeText(getApplicationContext(), main, Toast.LENGTH_LONG).show();
for( Element elemen : doc.select("a") )
{ List<String> subm = new ArrayList<String>();
String sub = elemen.toString();
subm.add(sub);
mas.put(main,subm);
}
}
我不明白您所说的格式正确的输出是什么意思,但我认为至少我可以帮助您解决问题的第一部分。这就是如何使用 h3 标签文本作为键,列表中的以下标签作为值来构建地图:
String html = ""
+"<html>"
+"<body>"
+"<h3>title 1</h3>"
+"<a>'a paragraph 1 here'</a>"
+"<a>'a paragraph 2 here'</a>"
+"<a>'a paragraph 3 here'</a>"
+"<h3><b>title 2</b></h3>"
+"<a>'a paragraph 4 here'</a>"
+"<a>'a paragraph 5 here'</a>"
+"<a>'a paragraph 6 here'</a>"
+"</body></html>";
Document doc = Jsoup.parse(html);
Elements as = doc.select("a");
String currentTitle = null;
Map<String,List<String>> mas = new LinkedHashMap<>();
for (Element a : as){
if ("h3".equals(a.previousElementSibling().tagName())){
currentTitle = a.previousElementSibling().text();
mas.put(currentTitle, new ArrayList<String>());
}
mas.get(currentTitle).add(a.text());
}
System.out.println(""+mas);
上面的程序使用 previousElementSibling()
方法来识别直接位于 a 元素之前的 h3 标签。剩下的应该很容易理解了。
请注意,我使用 LinkedHashMap 是为了 h3 标签的原始顺序。