我尝试使用 JSoup 直接提取文本,但您是对的,因为所有内容都被捆绑在一起,最终得到一个包含所有不易处理的内容的字符串。
退后一步,您可以改为使用doc.select("ul li span")
. 从那里,您可以过滤包含文本的元素,MW
然后从那里开始,获取文本,将其拆分,", "
用作分隔符,以获取数组并获取结果的最后一个元素(整数)。我通过包装结果将其解析为整数,Integer.parseInt
如果您只想要该String
值,您可以使用它来删除。
最后,将过滤并映射到正确值的结果收集到一个列表中。
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import static java.util.stream.Collectors.toList;
public class JSoupExtract {
public static final String input = "<ul>" +
"<li><span></span><a, rel=\"nofollow\"><span>Afterword</span></a></li>" +
"<li><span></span><a, rel=\"nofollow\"><span>MW, Chapter, 2255</span></a></li>" +
"<li><span></span><a, rel=\"nofollow\"><span>MW, Chapter, 2254</span></a></li>" +
"<li><span></span><a, rel=\"nofollow\"><span>MW, Chapter, 2253</span></a></li>" +
"<li><span></span><a, rel=\"nofollow\"><span>MW, Chapter, 2252</span></a></li>" +
"</ul>"; // TOKEN_ID = 0^ 1^ 2^
public static final int INT_TOKEN_ID = 2;
public static void main(String[] args) {
Document doc = Jsoup.parse(input);
Elements elements = doc.select("ul li span");
List<Integer> result = elements.stream()
.filter(e -> e.text() != null && e.text().startsWith("MW"))
.map(e -> Integer.parseInt(e.text().split(", ")[INT_TOKEN_ID]))
.collect(toList());
System.out.println(result);
}
}
输出:
[2255, 2254, 2253, 2252]