0

htmlタグ内にいくつかのliオブジェクトを持つulがあることを検証する方法はありますか(私はgroovyを使用しています)。ユニットテストでhtmlが有効なものを生成したことを確認するためにそれが必要です。

私はしたいと思います :

  • そのデータでli要素の数を抽出します
  • が指定されたクラスで指定された内部にあることを検証します。そのdiv内は異なるhtmlタグである可能性がありますが、私はそれらを気にしません
テキストの例: <div class="example">...<ul><li>Element1</li><li>Element2</li><ul>...</div>

最も簡単な方法を試しました。 <li>.+?</li>これにより、li要素を抽出できますが、有効なuldiv構造を確認する必要があります。

なぜこれが機能しないのですか?<div class='example'>.+?<ul>(<li>.+?</li>)*<ul>.+?</div> どのようにすべきですか?

任意のヒント?

どうもありがとう

4

3 に答える 3

4

jsoupなどの HTML スクレイピング ライブラリを使用すると、プレーンな正規表現を使用するよりも簡単で楽しくなります。jsoup は Java ライブラリなので、groovy で使用できるはずです。

于 2012-09-29T19:15:08.193 に答える
1

jsoupを使用して、このテストを検討してください(以下)。

ノート:

  • 正規表現を使用していませんが、他の回答によると、それは悪い考えです。
  • このverifyHtml()メソッドは、HTMLのフラグメントを受け入れます。

例:

import groovy.util.*
import org.jsoup.*
import org.jsoup.nodes.* 
import org.jsoup.select.* 

class HtmlTester extends GroovyTestCase {
    // returns true if fragment has:
    // <div class='list'> <ul> <li> ... </li> </ul> </div>
    def verifyHtml(String htmlFragment) {
        Document doc = Jsoup.parse(htmlFragment)
        Elements divs = doc.select("div.list ul li")
        boolean result = (divs.size() > 0)

        return result
    }

    void testDivNoClass() {
        def htmlDivNoClass = "<div><ul><li>list 1</li></ul></div>"        
        assertFalse verifyHtml(htmlDivNoClass)
    }

    void testDivNoUl() {
        def htmlDivNoUl = "<div class='list'></div>"        
        assertFalse verifyHtml(htmlDivNoUl)
    }

    void testDivUlNoLi() {
        def htmlDivUlNoLi = "<div class='list'><ul></ul></div>"        
        assertFalse verifyHtml(htmlDivUlNoLi)
    }

    void testWithGoodHtml() {
        def html = """
        <div class='list'>
            <ul>
                <li>list 1</li>
                <li>list 2</li>
            </ul>
        </div>
        """    
        assertTrue verifyHtml(html)
    }    
}
于 2012-10-01T03:01:02.327 に答える
1

XML のように解析し、要素を数えることができます。

def html = '''
  <html>
    <ul>
      <li>item 1</li>
      <li>item 2</li>
      <li>item 3</li>
      <li>item 4</li>
    </ul>
  </html>'''

def htmlNode = new XmlParser().parseText html

assert htmlNode.ul.li.size() == 4

HTMLがタグを正しく閉じていない場合は、NekoHTMLなどのライブラリを使用してHTMLを正規化できます

于 2012-09-30T01:11:29.553 に答える