ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 使用选择器语法来查找元素 <h1><span style="font-size: 14px; line-height: 1.5;">问题</span></h1> <p>你想使用类似于CSS或jQuery的语法来查找和操作元素。</p> <h2>方法</h2> <p>可以使用<code><a title="Find elements that match the Selector query, with this element as the starting context." href="http://jsoup.org/apidocs/org/jsoup/nodes/Element.html#select%28java.lang.String%29">Element.select(String selector)</a></code> 和 <code><a title="Find matching elements within this element list." href="http://jsoup.org/apidocs/org/jsoup/select/Elements.html#select%28java.lang.String%29">Elements.select(String selector)</a></code> 方法实现:</p> <pre><code>File input = new File("/tmp/input.html"); Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/"); Elements links = doc.select("a[href]"); //带有href属性的a元素 Elements pngs = doc.select("img[src$=.png]"); //扩展名为.png的图片 Element masthead = doc.select("div.masthead").first(); //class等于masthead的div标签 Elements resultLinks = doc.select("h3.r &gt; a"); //在h3元素之后的a元素 </code></pre> <h2>说明</h2> <p>jsoup elements对象支持类似于<a href="http://www.w3.org/TR/2009/PR-css3-selectors-20091215/">CSS</a> (或<a href="http://jquery.com/">jquery</a>)的选择器语法,来实现非常强大和灵活的查找功能。.</p> <p>这个<code>select</code> 方法在<code><a title="A HTML Document." href="http://jsoup.org/apidocs/org/jsoup/nodes/Document.html">Document</a></code>, <code><a title="A HTML element consists of a tag name, attributes, and child nodes (including text nodes and other elements)." href="http://jsoup.org/apidocs/org/jsoup/nodes/Element.html">Element</a></code>,或<code><a title="A list of Elements, with methods that act on every element in the list." href="http://jsoup.org/apidocs/org/jsoup/select/Elements.html">Elements</a></code>对象中都可以使用。且是上下文相关的,因此可实现指定元素的过滤,或者链式选择访问。</p> <p>Select方法将返回一个<code><a title="A list of Elements, with methods that act on every element in the list." href="http://jsoup.org/apidocs/org/jsoup/select/Elements.html">Elements</a></code>集合,并提供一组方法来抽取和处理结果。</p> <h3>Selector选择器概述</h3> <ul> <li><code>tagname</code>: 通过标签查找元素,比如:<code>a</code></li> <li><code>ns|tag</code>: 通过标签在命名空间查找元素,比如:可以用 <code>fb|name</code> 语法来查找 <code>&lt;fb:name&gt;</code> 元素</li> <li><code>#id</code>: 通过ID查找元素,比如:<code>#logo</code></li> <li><code>.class</code>: 通过class名称查找元素,比如:<code>.masthead</code></li> <li><code>[attribute]</code>: 利用属性查找元素,比如:<code>[href]</code></li> <li><code>[^attr]</code>: 利用属性名前缀来查找元素,比如:可以用<code>[^data-]</code> 来查找带有HTML5 Dataset属性的元素</li> <li><code>[attr=value]</code>: 利用属性值来查找元素,比如:<code>[width=500]</code></li> <li><code>[attr^=value]</code>, <code>[attr$=value]</code>, <code>[attr*=value]</code>: 利用匹配属性值开头、结尾或包含属性值来查找元素,比如:<code>[href*=/path/]</code></li> <li><code>[attr~=regex]</code>: 利用属性值匹配正则表达式来查找元素,比如: <code>img[src~=(?i)\.(png|jpe?g)]</code></li> <li><code>*</code>: 这个符号将匹配所有元素</li> </ul> <h3>Selector选择器组合使用</h3> <ul> <li><code>el#id</code>: 元素+ID,比如: <code>div#logo</code></li> <li><code>el.class</code>: 元素+class,比如: <code>div.masthead</code></li> <li><code>el[attr]</code>: 元素+class,比如: <code>a[href]</code></li> <li>任意组合,比如:<code>a[href].highlight</code></li> <li><code>ancestor child</code>: 查找某个元素下子元素,比如:可以用<code>.body p</code> 查找在"body"元素下的所有 <code>p</code>元素</li> <li><code>parent &gt; child</code>: 查找某个父元素下的直接子元素,比如:可以用<code>div.content &gt; p</code> 查找 <code>p</code> 元素,也可以用<code>body &gt; *</code> 查找body标签下所有直接子元素</li> <li><code>siblingA + siblingB</code>: 查找在A元素之前第一个同级元素B,比如:<code>div.head + div</code></li> <li><code>siblingA ~ siblingX</code>: 查找A元素之前的同级X元素,比如:<code>h1 ~ p</code></li> <li><code>el, el, el</code>:多个选择器组合,查找匹配任一选择器的唯一元素,例如:<code>div.masthead, div.logo</code></li> </ul> <h3>伪选择器selectors</h3> <ul> <li><code>:lt(n)</code>: 查找哪些元素的同级索引值(它的位置在DOM树中是相对于它的父节点)小于n,比如:<code>td:lt(3)</code> 表示小于三列的元素 </li> <li><code>:gt(n)</code>:查找哪些元素的同级索引值大于<code>n</code><code>,比如</code>: <code>div p:gt(2)</code>表示哪些div中有包含2个以上的p元素</li> <li><code>:eq(n)</code>: 查找哪些元素的同级索引值与<code>n</code>相等,比如:<code>form input:eq(1)</code>表示包含一个input标签的Form元素</li> <li><code>:has(seletor)</code>: 查找匹配选择器包含元素的元素,比如:<code>div:has(p)</code>表示哪些div包含了p元素 </li> <li><code>:not(selector)</code>: 查找与选择器不匹配的元素,比如: <code>div:not(.logo)</code> 表示不包含 class=logo 元素的所有 div 列表 </li> <li><code>:contains(text)</code>: 查找包含给定文本的元素,搜索不区分大不写,比如: <code>p:contains(jsoup)</code></li> <li><code>:containsOwn(text)</code>: 查找直接包含给定文本的元素</li> <li><code>:matches(regex)</code>: 查找哪些元素的文本匹配指定的正则表达式,比如:<code>div:matches((?i)login)</code></li> <li><code>:matchesOwn(regex)</code>: 查找自身包含文本匹配指定正则表达式的元素</li> <li>注意:上述伪选择器索引是从0开始的,也就是说第一个元素索引值为0,第二个元素index为1等</li></ul>