我是否在html代码的内容中获得包含单词的标签和类名

时间:2014-06-17 06:01:45

标签: java html jsoup

给出

<tagname class="classname">content contain "Posted by"word </tagname>

我的方法是:

  1. 从网站获取所有内容。

  2. 查找&#34;发布者&#34;内容中的文字。

  3. 获取具有此内容的标记和类名。

  4. 我需要在各个网站中找到所有发布日期,例如http://www.testthisblog.com/

    本网站的HTML代码包含一些内容,其中包含&#34;发布者&#34;字。

    <span class="chronodata">
         Posted by
         Eric Jacobson
         at
         <a class="timestamp-link"  href="http://www.testthisblog.com/2014/05/documenting-tests-part-2-tester-leaves.html"  title="permanent link">Tuesday, May 27, 2014</a>
    </span>
    

    所以我尝试搜索&#34;发布者&#34;使用此Java代码的内容中的单词

    String url = "http://www.testthisblog.com";
    
    /*step1*/ 
    Document doc = Jsoup.connect(url).get();
    String htmlTxt = doc.text().toLowerCase();
    Pattern pattern = Pattern.compile(".*Posted by.*");
    /*step2*/ 
    Matcher matcher = pattern.matcher(htmlTxt);
    if(matcher.find()){
      System.out.println("Find a word!!!");
    
     /*step3*/    >>What is possible? can I get tag and class name here?<<
    }
    

    我使用Jsoup库,这种方法对其他网站应该是灵活的。

3 个答案:

答案 0 :(得分:1)

有可能;这样做的一种方法是将regex应用于每个元素文本,如果它匹配get标记和类

    String url = "http://www.testthisblog.com";

    Pattern pattern = Pattern.compile(".*Posted by*");

    Document doc = Jsoup.connect(url).get();
    Elements els = doc.getAllElements();
    for (int i = 0; i < els.size(); i++) {
        Element element = els.get(i);
        String txt = element.ownText();
        Matcher matcher = pattern.matcher(txt);
        if (matcher.find()) {
            System.out.println(txt);
            System.out.println(element.tagName());
            System.out.println(element.className());
        }
    }

答案 1 :(得分:0)

accepted answer using regex似乎有点矫枉过正。

Elements elements = document.getElementsContainingOwnText( "Posted by" );

该比较不区分大小写。

答案 2 :(得分:0)

这可以做得更清洁。您可以直接使用getElementsMatchingOwnText()文档方法

String url = "http://www.testthisblog.com";
Document doc = Jsoup.connect(url).get();
for(Element element : doc.getElementsMatchingOwnText(".*Posted by*")){
    System.out.println(element.text());
}

请注意,我正在使用element.text()。这将删除所有html内容并为您提供实际值。所以在你的情况下它打印出来

Posted by Eric Jacobson at Tuesday, May 27, 2014
Posted by Eric Jacobson at Thursday, May 22, 2014
Posted by Eric Jacobson at Tuesday, May 13, 2014
Posted by Eric Jacobson at Friday, May 09, 2014
Posted by Eric Jacobson at Tuesday, April 29, 2014
Posted by Eric Jacobson at Thursday, April 24, 2014
Posted by Eric Jacobson at Wednesday, April 09, 2014

但如果你想单独打印日期

for(Element element : doc.getElementsMatchingOwnText(".*Posted by*")){
    System.out.println(element.select("a").first().text());
}

除此之外,如果您特别关注此站点,那么您可以直接获取具有chronodata的class属性的span。这是包含“发布者”字段的标记。

doc.select("span.chronodata");

但是,如果你特别关注正则表达式模式并且你可以确定容器标签,你可以使用:matchesOwn():contains()过滤器,如

doc.select("span:matchesOwn(Posted by)");
doc.select("span:contains(Posted by)");