0

我正在尝试解决以下问题。

假设我有一个 HTML 文件,内容如下:


</div class = nameCouldBeAnything1><br>
    <p>some text here</p><br>
</div>

<div class = nameCouldBeAnything2><br>
    <p>some more text here</p><br>
</div>

<div class = nameCouldBeAnything3><br>
    <p>even more text here</p><br>
<p>and here</p><br>
<p>and here</p><br>
<p>and here</p><br>
<p>and here</p><br>
</div>

我想要实现的是将div标签之间的内容存储到单独的字符串或字符串数​​组变量中。

如果有 Jsoup 解决方案,那就太好了,如果没有,那么从 p 开始并以 /p 结尾的正则表达式字符串匹配也很好。

需要考虑的挑战是:

1)您不能使用特定的div类名来精确定位p标签的位置,以便使用Jsoup获取明文。

2)使用doc.select("body p")doc.select("div p")来自 Jsoup 的作品,但是当您想将 p 标签存储到字符串变量中时,它们将单独写入变量而不是通过div写入变量。

这是我到目前为止所拥有的:

htmlFile = Jsoup.parse(input, "UTF-8");
Elements body = htmlFile.select("body p");
Element bodyStart = body.first();
Element bodyEnd = body.last(); 
Element p = bodyStart;
int divCount = 0; 

while(p != bodyEnd)
{
    p = body.get(divCount);
    System.out.println(p.text());        
    divCount++;
}

这将获得每个单独的 p 标签,但是我希望 p 标签保留在它们各自的 div 中,并将每个单独的 div 存储到字符串/字符串数组变量中。

4

3 回答 3

0

您需要遍历文档body->div->p而不是body->p.

Elements divs = htmlFile.select("body div");
//initialize div map here
for(Element div : divs) {
    Elements paras = div.getElementsByTag("p");
    for(Element para : paras) {
       String text = para.text();
    }
}

您可以在遍历时根据您的要求将其存储为任何数据结构。希望这可以帮助。

于 2012-08-21T09:23:42.017 回答
0

这会将包含 p-tag 的 div-tags 放入字符串列表中。

public class Main {
  public static void main(String[] args) throws IOException {
    File html = new File("src/main/resources/markup.html");
    Document doc = Jsoup.parse(html, "UTF-8");
    //all div tags wrapping a p tag
    Elements divs = doc.select("div:has(p)");
    //put the divs into a list
    List<String> list = new ArrayList<String>();
    for (Element div : divs) {
      list.add(div.toString());
      System.out.println(div + "\n");
    }
  }
}

标记.html

<!DOCTYPE html>
<head>
  <meta charset="UTF-8" />
  <title>whatever</title>
</head>

<body>
  <div class=nameCouldBeAnything0>
    <p>some text here</p>
  </div>

  <div class=nameCouldBeAnything1></div>

  <div class=nameCouldBeAnything2>
    <p>some more text here</p>
  </div>

  <div class=nameCouldBeAnything3>
    <p>even more text here</p>
    <p>and here</p>
    <p>and here</p>
    <p>and here</p>
    <p>and here</p>
  </div>

  <div class=nameCouldBeAnything4>
    <span>even more text here</span>
  </div>
</body>
</html>

输出

<div class="nameCouldBeAnything0"> 
  <p>some text here</p> 
</div>

<div class="nameCouldBeAnything2"> 
  <p>some more text here</p> 
</div>

<div class="nameCouldBeAnything3"> 
  <p>even more text here</p> 
  <p>and here</p> 
  <p>and here</p> 
  <p>and here</p> 
  <p>and here</p> 
</div>
于 2012-08-21T09:46:45.033 回答
0

我能够解决我的困境。

这是我使用的代码,希望它可以帮助有需要的人。

感谢所有发帖的人。

public static ArrayList proc(Document htmlFile)
{
    Elements body = htmlFile.select("body");
    ArrayList HTMLPlainText = new ArrayList();

    HTMLPlainText.add(htmlFile.title());

    for(Iterator<Element> it = body.iterator(); it.hasNext();)
    {
        Element pBody = it.next();
        Elements. pTag = pBody.getElementsByTag("p");parents();

            for(int pTagCount = 0; pTagCount < pTag.size(); pTagCount++)
            {
                Element p = pTag.get(pTagCount);
                String pt = p.text();

                if(pt.length() != 0)
                {
                    HTMLPainText.add(pt);
                    pTagCount++:
                }

                pTag.parents().empty();     

            }
    }
}

注意,可能有一些语法错误,我是手动输入的。

于 2012-08-28T07:51:20.500 回答