- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近3天我试图通过Java中的jsoup解析某些信息-_-,这是我的代码:
Document document = Jsoup.connect(urlofpage).get();
Elements links = document.select(".contentBox");
for (Element link : links) {
// String name = link.text();
String title = link.select("h2").text();
int h2length = link.select("h2").size();
for( int i = 0; i <= h2length -1; i++)
{
String s = link.select("h2").get(i).text();
boolean desc1 = Pattern.compile("What is").matcher(s).find();
boolean desc2 = Pattern.compile("Uses for").matcher(s).find();
if(desc1 == true || desc2 == true)
{
String descritop = "";
int plength = link.select("p ~ h2 ~ p").size() - link.select("h2 ~ p").size();
System.out.println(h2length);
String ssv = link.select("h2 ~ p").get(1).text();
}
}
它正在按指示获取数据,分别获取 h2 和 p 的数据,但问题是,我想解析 d ata inside of <p> tag which is just after every <h2> tag
.
例如(HTML 内容):
<h2>main content</h2>
<div class="acx"><div>
<p>content</p>
<p>content 2</p>
<h2>content 2</h2>
<div class="acx"><div>
<p>new content od 2</p>
<p>new 2</p>
现在它应该像(在数组中)一样获取:
array[0] = "content content 2",
array[1] = "new content od 2 new 2",
有什么解决办法吗?
最佳答案
我的想法很简单。获取 h2
元素之后的第一个 p
元素并将其添加到 ArrayList,然后检查下一个元素是否为 p 并将其添加。例如:
ArrayList<ArrayList<String>> textInsidePList = new ArrayList<ArrayList<String>>();
for (Element link : links) {
Elements headings2 = link.select("h2 ~ p");
for (int i = 0; i < headings2.size(); i++) {
ArrayList<String> textInsideP = new ArrayList<String>();
textInsideP.add(headings2.get(i).text());
Element nextPar = headings2.get(i).nextElementSibling();
if (nextPar.nodeName() == "p") {
textInsideP.add(nextPar.text());
}
textInsidePList.add(textInsideP);
}
}
如果你有超过 2 个 p
元素,你只需要编写一个递归即可。但如果 p
之间可以有其他元素,则此代码将不起作用。结果,您将拥有一个 ArrayList,其中包含一个 ArrayList,该 ArrayList 表示 h2
元素以及来自 p
节点的文本。
编辑。递归示例:
public static void main(String[] args) throws IOException {
String html = "<h2>first h2</h2>" +
"<div class=\"acx\"></div>" +
"<p>first h2 content 1</p>" +
"<p>first h2 content 2</p>" +
"<p>first h2 content 3</p>" +
"<p>first h2 content 4</p>" +
"<h2>second h2</h2>" +
"<div class=\"acx\"></div>" +
"<p>second h2 content 1</p>" +
"<p>second h2 content 2</p>";
Document document = Jsoup.parse(html);
/* creating first order ArrayList */
ArrayList<ArrayList<String>> textInsidePList = new ArrayList<ArrayList<String>>();
Elements headings2 = document.select("h2");
for (Element heading2 : headings2) {
/* creating second order ArrayList and adding data */
ArrayList<String> textInsideP = new ArrayList<String>();
textInsideP.add(heading2.text()); // delete this line to remove h2 content from array, this just for example
parsingRecursion(heading2, textInsideP);
textInsidePList.add(textInsideP);
}
/* iteraiting through ArrayList */
for (ArrayList<String> firstH2 : textInsidePList) {
System.out.println("h2:");
for (String parsInsideH2 : firstH2) {
System.out.println(parsInsideH2);
}
}
}
/* recursive function */
private static void parsingRecursion(Element heading2, ArrayList<String> textInsideP) {
Element nextPar = heading2.nextElementSibling();
if (nextPar != null && nextPar.nodeName() == "p") {
textInsideP.add(nextPar.text());
parsingRecursion(nextPar, textInsideP);
} else if (nextPar != null && nextPar.nodeName() != "h2") {
Element nextNotP = nextPar.nextElementSibling();
textInsideP.add(nextNotP.text());
parsingRecursion(nextNotP, textInsideP);
}
}
}
控制台输出:
h2:
first h2
first h2 content 1
first h2 content 2
first h2 content 3
first h2 content 4
h2:
second h2
second h2 content 1
second h2 content 2
使用递归是因为我们不知道在h2
之前会遇到多少个“p”节点。使用 ArrayList 代替数组,因为我们可以动态添加元素而无需设置数组的大小。
编辑 #2,因为问题已更改:
public static void main(String[] args) throws IOException {
Document document = Jsoup.connect(pathToYoursCusromUrl).get();
Elements links = document.select(".contentBox");
for (Element link : links) {
/* creating first order ArrayList */
ArrayList<ArrayList<String>> textInsidePList = new ArrayList<ArrayList<String>>();
Elements headings2 = document.select("h2");
for (Element heading2 : headings2) {
/* creating second order ArrayList and adding data */
ArrayList<String> textInsideP = new ArrayList<String>();
parsingRecursion(heading2, textInsideP);
textInsidePList.add(textInsideP);
}
/* iteraiting through ArrayList */
for (ArrayList<String> firstH2 : textInsidePList) {
System.out.println("h2:");
for (String parsInsideH2 : firstH2) {
System.out.println("p:" + parsInsideH2);
}
}
}
}
/* recursive function */
private static void parsingRecursion(Element heading2, ArrayList<String> textInsideP) {
Element nextPar = heading2.nextElementSibling();
if (nextPar != null && nextPar.nodeName() == "p") {
textInsideP.add(nextPar.text());
parsingRecursion(nextPar, textInsideP);
} else if (nextPar != null && nextPar.nodeName() != "h2") {
Element nextNotP = nextPar.nextElementSibling();
if (nextNotP != null) {
textInsideP.add(nextNotP.text());
parsingRecursion(nextNotP, textInsideP);
}
}
}
}
控制台输出:
h2:
p:Vitamins A, D, and E topical (for the skin) is a skin protectant. It works by moisturizing and sealing the skin, and aids in skin healing.
p:This medication is used to treat diaper rash, dry or chafed skin, and minor cuts or burns.
p:Vitamins A, D, and E may also be used for purposes not listed in this medication guide.
h2:
p:You should not use this medication if your child is allergic to it. Do not apply vitamins A, D, and E topical without a rubber glove or finger cot if you are allergic this medication.
p:Ask a doctor or pharmacist if it is safe for you to use this medication on your child if the child is allergic to any medicines or skin products, including soaps, oils, lotions, or creams.
p:Stop using the medication and call your doctor at once if your child has a serious side effect such as warmth, redness, oozing, or severe irritation where the medicine is applied.
p:Keep the baby's diaper area as dry as possible. Change wet or soiled diapers immediately to keep wetness and bacteria from irritating the baby's skin. Always put on a new diaper when the baby first wakes up in the morning, and also just before putting the baby to bed each night.
等等...
关于java - jsoup : parse data of p tag which is between every h2 tag,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43802164/
我有一些像这样的 html: zip code 我的 Java 代码 Elements formElements = doc.getElementsByTag("form"); for(Ele
我无法使用 创建 session jsoup 以及如何使用 jsoup 发布数据.请帮助我,我是新来的 jsoup api ,实际上我的代码是: Connection.Response res = J
我想添加一个新的元标记 Document doc = Jsoup.parse(.....) doc.select("meta").first.appendElement("meta".attr("na
有没有办法用 Jsoup 保留新行,(不是 )? Document pdsc = Jsoup.connect("http://drafts.bestsiteeditor.com/promoters/d
我需要将 jsoup 元素映射回源 HTML 中的特定字符偏移量。换句话说,如果我有这样的 HTML: Hello World 我需要知道“Hello”从偏移量 0 开始,长度为 6 个字符,从偏移
我喜欢用 Jsoup 解析 html,但是他们的连接有问题,我需要将请求发送到同一个网站但不同的查询参数,比如“id=XXX”,请求是这样的: http://website/?id=XXX 我不想为每
我有代码,有点像这样 String str = " >foo< "; Document doc = Jsoup.parse(str, "", Parser.xmlParser()); 但
是否可以使用 jsoup 来验证 HTML 片段?我想知道标记是否格式错误,而不是让 jsoup 自动修复它,我希望能够通知用户自己修复源标记。 最佳答案 Jsoup 不是检查 xml 或 html
Jsoup 有 2 个 html parse() 方法: > parse(String html) - "由于没有指定基本 URI,绝对 URL检测依赖于包含标记的 HTML。” > parse(St
我正在尝试使用 jsoup 从此网页中提取所有图片网址?任何人都可以提供有关如何做到这一点的帮助吗?所有标签的格式都是这样的,但我只需要 src 图像,而不是 ajaxsrc: 链接在这里: htt
我试图找到所有 或 一页/文档中的标签。 我如何使用 OR运算符(operator)在 doc.select("div.name1 OR div.name2") ? 最佳答案 select metho
我为我的项目创建了一个新模块来添加一些额外的功能。在该模块中,我在模块的 Gradle 文件 implementation 'org.jsoup:jsoup:1.10.2' 中添加了 Jsoup 依赖
我正在寻找这个 div 中的主图像 我试过这个: Document document = Jsoup.connect(url).get(); Elements img = document.se
谁能解释一下 JSoup 中提供的 Element 对象和 Node 对象之间的区别? 在什么情况/条件下使用什么最好。 最佳答案 节点是 DOM 层次结构中任何类型对象的通用名称。 元素是一种特定类
有什么方法可以防止 Jsoup 的 HTML 解析器将单个标签(最具体的是 标签)转换为自闭合标签? 标签是有效的 HTML5 元素,但 Jsoup 一直将它们转换为 . 我在下面的链接中有一个示
可以屏蔽吗 Jsoup.connect("http://xyz.com").get().html(); 作为对网站的浏览器调用? 我尝试构建一个壁纸下载工具,但在从服务器下载页面时遇到问题。 如果我下
我希望在 Groovy 中开发一个网络爬虫(使用 Grails 框架和 MongoDB 数据库),它能够爬取网站,创建网站 URL 列表及其资源类型、内容、响应时间和所涉及的重定向数量。 我正在讨论
如果我有一个看起来像这样的元素: bar text 1 bar text 2 我已经有了 元素被选中,我想选择 元素是 的直接子元素但不是
任何人都可以提供有关我将如何解析超大 HTML 流/文件的指针或建议。例如,我有一个大约有 270,000 行的表,我想一次将它带入我的应用程序大约 20,000 行。 jsoup 解析方法允许使用
我收到此错误: java.lang.RuntimeException: An error occured while executing doInBackground() at and
我是一名优秀的程序员,十分优秀!