【问题标题】:Detecting same tags pattern in web page using jsoup java使用jsoup java在网页中检测相同的标签模式
【发布时间】:2016-05-21 04:07:55
【问题描述】:

我正在编写用于检测网页中匹配标签模式的代码。这是示例。

<body>
 <table width="200" border="1">
   <tr>
     <td>Name</td>
     <td>Place</td>
     <td>Animal</td>
   </tr>
   <p>hello World</p>
   <tr>
    <td>Jack</td>
    <td>New york</td>
    <td>Lion</td>
   </tr>
   <b>Code Works</b>
   <tr>
    <td>George</td>
    <td>Sydney</td>
    <td>Tiger</td>
  </tr>
  <tr>
    <td>Tina</td>
    <td>Delhi</td>
    <td>Cat</td>
  </tr>
</table>
<table>
  <tbody>
    <tr>
     <td> </td> 
     <td>
<a href="/cgi-bin/site_searcher.cgi?START=20&amp;SEARCHTERM=asia&amp;SID=&amp;SEARCH=1&amp;BOOLEAN=&amp;CAT=">1</a>
<a href="/cgi-bin/site_searcher.cgi?START=20&amp;SEARCHTERM=asia&amp;SID=&amp;SEARCH=1&amp;BOOLEAN=&amp;CAT=">2</a>             
<a href="/cgi-bin/site_searcher.cgi?START=40&amp;SEARCHTERM=asia&amp;SID=&amp;SEARCH=1&amp;BOOLEAN=&amp;CAT=">3</a> 
<a href="/cgi-bin/site_searcher.cgi?START=60&amp;SEARCHTERM=asia&amp;SID=&amp;SEARCH=1&amp;BOOLEAN=&amp;CAT=">4</a> 
<a href="/cgi-bin/site_searcher.cgi?START=80&amp;SEARCHTERM=asia&amp;SID=&amp;SEARCH=1&amp;BOOLEAN=&amp;CAT=">5</a>  
     </td>
    </tr>
   </tbody>
  </table>
</body>

对于上面的标签模式,我需要找到重复出现的标签。并丢弃那些不在模式中的标签 bp。对于第一个表标签 tr 和 td 正在发生。对于第二个表“a”标签重复。 这是我到目前为止所做的:

  1. 使用 Jsoup 解析为 DOM 树。
  2. 然后使用节点访问者类遍历树。使用 head 和 tail 方法,我可以进入和退出标签。

但我对如何进一步进行感到困惑。 注意:标签模式不是固定的。标签模式会因网页结构而异。任何形式的帮助将不胜感激。

【问题讨论】:

  • @saka1029 对于上面的例子,tr 标签包括第一个表的 td 标签。对于第二个表'a'标签
  • @saka1029 正文仅包含 2 个表。其余元素也相应嵌套。
  • 请分享您的代码。
  • 你能解释一下什么是“重复出现的标签”吗?使用 POST 中的 html 代码可以准确地确定重复出现的标签是什么?
  • @swapnilgandhi 查看我的回答:stackoverflow.com/a/35336670/363573

标签: java html regex jsoup


【解决方案1】:

但我对如何进一步进行感到困惑。

您的困惑正在蔓延并影响到我们。不过,我会尽量给你一个提示。

您可以计算 HTML 代码中的标签。如果某个标签计数达到某个阈值,则可以认为该标签为“重复出现”。

// Load document
String html = ...
Document doc = Jsoup.parse(html);

// Count tags
String tagsSelector = "*";
Map<Element, Integer> tagsCountByType = new Hashmap<>();
for(Element e : doc.select("*")) {
    Integer count = tagsCountByType.get(e);
    if (count == null) {
        tagsCountByType.put(e, new Integer(1));
    } else {
        tagsCountByType.put(e, new Integer(count.intValue() + 1));
    }
}

// Find tag with a count greater than a given threshold
// ...

我没有测试代码。只是把它当作一个想法,某种灵感。

另一个想法,你可以缩小tagsSelector。例如:

// All elements (tags) under any table directly under body.
String tagsSelector = "body > table *"; 

【讨论】:

    猜你喜欢
    • 2018-07-05
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    相关资源
    最近更新 更多