【问题标题】:Deal with whitespaces in CSS class names with Jsoup使用 Jsoup 处理 CSS 类名中的空格
【发布时间】:2016-05-03 17:56:51
【问题描述】:

我想从这个页面中选择一些超市产品信息:

http://www.angeloni.com.br/super/index?grupo=15022

为此,我应该选择带有"lstProd " 类的<ul> 标签:

如果类名是"lstProd" 这很容易,但问题是名称末尾的空格。我无法让 Jsoup 处理它。

我尝试了下面的代码和其他方法,但它总是得到一个空列表。

org.jsoup.nodes.Document document = Jsoup.connect("http://www.angeloni.com.br/super/index?grupo=15022").get();
    org.jsoup.select.Elements list = doc.select("ul.lstProd  ");

我想从html页面获取的代码sn-p:

<ul class="lstProd  ">
    <li>
        <span class="cod">CÓD. 1341372</span>
        <span class="lnkImgProd">
            <a href="/super/produto?grupo=15022&amp;idProduto=1341372">
                <img src="http://assets.angeloni.com.br/files/images/7/1B/C6/1341372_1_V.jpg" width="120" height="120"
                     alt="Creme Dental SORRISO Super Refrescante Tubo 90g">
            </a>
                    </span>
        <div class="RgtDetProd">
            <div class="boxInfoProd">
                <span class="descr">
                    <a href="/super/produto?grupo=15022&amp;idProduto=1341372">Creme Dental SORRISO Super Refrescante
                        Tubo 90g</a>

                                    </span>

                <ul class="lstProdFlags after">
                </ul>
            </div>
...

【问题讨论】:

    标签: java dom web-crawler jsoup


    【解决方案1】:

    我认为您面临两个完全不同的问题:

    1. Jsoup 不会加载您认为它加载的站点。您指定的网站通过 JavaScript 呈现其内容,并在通过 AJAX 加载初始页面后加载一些内容。 JSoup 无法处理这个问题。您要么需要调查 AJAX 调用并直接使用 Jsoup 获取它们,要么使用 selenium webdriver 之类的东西在真实的浏览器中获取页面,这将按照您的预期呈现所有内容。

    2. CSS 类名不能包含实际用途的空格1。在 HTML 中,空格用作类名之间的分隔符。因此&lt;ul class="lstProd "&gt;&lt;ul class="lstProd"&gt; 相同。然而,在 CSS 选择器中,类名由 .className 指定,即点后跟类名。你可以像这样连接几个类:element.select(".className1.className2")

    1 从技术上讲,您可以在 CSS 类中放置空格,但您需要使用 '\ ' 转义它们。见https://mathiasbynens.be/notes/css-escapesWhich characters are valid in CSS class names/selectors?

    编辑:更准确的 CSS 类名

    【讨论】:

    • 我明白了。我使用 Jaunt Api,它是一个简单的 Java Web Crawler,它可以处理那个页面。但是 Jaunt 不是免费的,所以我转向 JSoup。你知道其他可以处理这种事情的 API 吗?我觉得 selenium webdriver 是不是有点太重了?
    • 我很困惑。由于你所说的,Jaunt 也无法处理。我会试试网络驱动程序。
    • webdriver 绑定到 HTML-Unit,这是一个纯 Java 的解决方案并且是轻量级的。问题是它通常不像普通浏览器那样处理复杂的 JavaScript。不过值得一试。下一个最佳选择是 phantomjs 绑定,它至少是无头的。
    【解决方案2】:

    CSS 类名 CAN 包含空格。
    并且&lt;ul class="lstProd "&gt;&lt;ul class="lstProd"&gt;相同。

    我可以看到您有多个 &lt;ul&gt; 具有相同的类名。
    检查或遍历此类元素的更好方法是 nth-child
    所以要找到你需要的选择器,你可以使用#abaProd &gt; ul:nth-child(4)
    For more details about nth-child

    【讨论】:

    猜你喜欢
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 2017-02-26
    • 2015-03-08
    • 2019-07-18
    • 1970-01-01
    • 2016-06-07
    相关资源
    最近更新 更多