是否有另一种方法可以从不提供API的网站中获取文本?

时间:2016-01-21 21:14:13

标签: curl httprequest httpresponse

我们有Slack的机器人,它将接受输入,例如:

bible John 3:17 (ESV)

这将转变为对

的调用

https://www.biblegateway.com/passage/?search=John+3:17&version=ESV

所以,我们现在所做的只是轻轻一点og.description,例如,对于上述情况,我们得到:

curl 'https://www.biblegateway.com/passage/?search=John+3:17&version=ESV' | grep "og:description" | sed 's/.*content="//' | sed 's/".*//'

For God did not send his Son into the world to condemn the world, but in order that the world might be saved through him.

这适用于小型请求,例如bible John 3:1-4 - 但是,如果我们请求更大的部分,则描述字段会在某个点被截断。因此,如果我们要做bible John 3,它只会返回John 1的前5个或更多的经文。

除了上面的卷曲之外,还有更好的方法吗?响应中唯一包含全文的地方是原始html,例如:

<h1 class="passage-display"> <span class="passage-display-bcv">John 3</span><span class="passage-display-version">English Standard Version (ESV)</span></h1> [ ... etc. etc. ... ]

我们应该只关注http请求吗?

2 个答案:

答案 0 :(得分:1)

如果你想坚持使用oneliner,但是对于你刮掉的东西更精确,你可以尝试Mojolicious Perl项目。 Here's an example语法:

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="fr.djey.secretapp.MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapse_toolbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_scrollFlags="scroll|exitUntilCollapsed"
            android:fitsSystemWindows="true"
            app:expandedTitleMarginStart="48dp"
            app:expandedTitleMarginEnd="64dp">

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/image"
                android:fitsSystemWindows="true"
                app:layout_collapseMode="parallax"
                android:scaleType="centerCrop"/>

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
                app:layout_collapseMode="pin"/>

        </android.support.design.widget.CollapsingToolbarLayout>

    </android.support.design.widget.AppBarLayout>

    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="fill_vertical"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <android.support.v7.widget.CardView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="16dp">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:padding="16dp">

                <TextView
                    android:id="@+id/description"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="@string/lorem_ipsum"
                    android:textColor="@android:color/black"/>

            </LinearLayout>

        </android.support.v7.widget.CardView>

    </android.support.v4.widget.NestedScrollView>

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        android:src="@android:drawable/ic_dialog_email" />

</android.support.design.widget.CoordinatorLayout>

这将解析标签中的文本。对于一行过于复杂的任务,请参阅Mojo web scraping example

安装Mojolicious很容易:

perl -Mojo -E 'say g("mojolicious.org")->dom->at("title")->text'

即使您不了解Perl,您也可以将拼凑工作所需的内容拼凑在一起,因为如果您使用过jQuery,DOM遍历的语法可能会很熟悉。 / p>

答案 1 :(得分:0)

scripture_lookup的CLI非常快速且易于使用。

为普通的经文提供者提供一个干净的界面,例如Crossways ESV和Bible Gateway。

当前(默认)提供者是BibleGatewayScraper,它从圣经网关中撤回经文。

https://github.com/wrightling/scripture_lookup