используя skrape {it} для получения данных из html - PullRequest
0 голосов
/ 31 января 2020

Я создаю kotlin веб-приложение, использующее skrape {it}.

До сих пор мне удавалось получить некоторую информацию, которая мне нужна, но я не могу получить остальное, мне нужно получить href ссылка из html таблицы. см. ниже ...

   <div class="CollapsiblePanelTab" tabindex="0">Today's Interest (1)</div>
   <div class="CollapsiblePanelContent">
   <table width="667px"  class="tabularData">

  <tr>
    <td width="407px" height="21"><a href="link info i need in here">description </a></td>
    <td width="130px">15:28</td>
    <td width="130px">Western</td>
  </tr> 

Я могу получить информацию о вкладке складной панели, но не href, я не могу понять, как попасть в таблицу.

Я сделал это, вылечив пример кода на странице библиотеки github.

у кого-нибудь есть идеи?

мой код

import it.skrape.selects.el
import it.skrape.skrape

data class MyScrapedData(
    val userName: String
)

fun main() {
    val githubUserData = skrape {
        url = "http://www.website" 

        extract {
            MyScrapedData(
                userName = el("div.CollapsiblePanel").text() 
            )
        }
    }
    println("${githubUserData.userName} is data selected ")

Спасибо за любую информацию

1 Ответ

1 голос
/ 31 января 2020

глядя на синтаксис, я предполагаю, что вы используете версию 0.6.0. Вы должны использовать более точный c css -селектор.

data class MyScrapedData(
   val userName: String,
   val link: String
)

fun main() {
    val githubUserData = skrape {
        url = "http://www.website" 

        extract {
            MyScrapedData(
                userName = el("div.CollapsiblePanel").text(),
                link = el("table tr td a").attr("href")
            )
        }
    }
    println("selected user: ${githubUserData.userName}")
    println("selected link: ${githubUserData.link}")

    // will print:
    // Today's Interest (1)
    // link info i need in here
}

Более подробную информацию о css селекторах можно найти здесь: https://www.w3schools.com/cssref/css_selectors.asp

Вы также можете попробовать версию 1.0.0-alpha5. Я знаю, что это альфа-версия, но она полностью работает, и вы могли бы делать вещи еще более элегантно.

РЕДАКТИРОВАТЬ: Если вы хотите извлечь несколько ссылок, которые вы можете сделать (используя версию 0.6.0 ) это выглядит следующим образом:

при условии, что HTML, который вы хотите проанализировать, имеет следующую структуру:

<div class="CollapsiblePanelTab" tabindex="0">Today's Interest (1)</div>
    <div class="CollapsiblePanelContent">
        <table width="667px" class="tabularData">
            <tr>
                <td><a href="1st link">description </a></td>
                <td><a href="2nd link">description </a></td>
                <td><a href="3rd link">description </a></td>
                <td><a href="4th link">description </a></td>
                <td>no link in here</td>
            </tr> 
        </table>
    </div>
</div>

Измените ссылку на свойство классов данных на тип List<String>

data class MyScrapedData(
   val userName: String,
   val links: List<String>
)

Используйте elements вместо element, чтобы выбрать все соответствующие вхождения css -селектора, и вызовите eachAttr("href"), чтобы извлечь значение всех соответствующих атрибутов href.

fun main() {
    val githubUserData = skrape {
        url = "http://www.website" 

        extract {
            MyScrapedData(
                userName = element("div.CollapsiblePanel").text(),
                links = elements("table tr td a").eachAttr("href")
            )
        }
    }
    println("selected user: ${githubUserData.userName}")
    println("selected links: ${githubUserData.links}")

    // will print:
    // selected user: Today's Interest (1)
    // selected links: [1st link, 2nd link, 3rd link, 4th link]
}

СОВЕТ: Идентификатор артефакта изменен с core на skrapeit-core с версии 0.4.2 и выше. Я думаю, что по этой причине вы не смогли обновить версию. Таким образом, вы должны добавить зависимость skrape {it} следующим образом:

используя Gradle:

implementation("it.skrape:skrapeit-core:0.6.0")
// instead of implementation("it.skrape:core:0.4.1")

используя Maven:

<dependency>
   <groupId>it.skrape</groupId>
   <artifactId>skrapeit-core</artifactId>
   <version>0.6.0</version>
</dependency>
...