使用python刮取动态网站(CSS?)

时间:2015-04-12 12:06:54

标签: python-3.x selenium-webdriver beautifulsoup dynamic-websites

我想知道本地库中是否有可用的项目。我可以在目录中看到这个带有绿色图标(可用)或红色图标(借出/不可用)。

首先我尝试了beautifullsoup,这是我试过的python代码:

try:
    import urllib.request as urllib2
except ImportError:
    import urllib2
from bs4 import BeautifulSoup

page = urllib2.urlopen("http://zoeken.mol.bibliotheek.be/?itemid=|library/marc/vlacc|9394694&undup=false")
soup = BeautifulSoup(page)

bal = soup.find(class_="avail-icon")
print(bal)

但是当firefox中的元素检查给出:

<span class="avail-icon">
    <i class="circle-icon avail-icon-none"></i>
    <span class="hidden-text"></span>
</span>

class =&#34; circle-icon avail-icon-none&#34;表示该项目可用(在网页上显示绿色图标), class =&#34; circle-icon avail-icon-loanedout&#34;表示项目已借出(在网页上显示红色图标)。

我得到了:

<span class="avail-icon">
    <i class="circle-icon avail-icon-loading"></i>
    <span class="hidden-text">Toon beschikbaarheid voor</span>
</span>

class =&#34; circle-icon avail-icon-loading&#34;意味着动态,我认为,经过一番搜索,我找到了Selenium。

我尝试了以下代码:

from bs4 import BeautifulSoup
from selenium import webdriver

driver = webdriver.Firefox()
driver.get("http://zoeken.mol.bibliotheek.be/?itemid=|library/marc/vlacc|9394694&undup=false")

html = driver.page_source
soup = BeautifulSoup(html)

bal = soup.find(class_="avail-icon")
print(bal)

可悲的是,这给了我:

<span class="avail-icon">
    <i class="circle-icon avail-icon-unknown"></i>
    <span class="hidden-text">Toon beschikbaarheid voor</span>
</span>

在Selenium抓住网页之前,我可能还没有等待,所以经过一些搜索后我将代码更改为:

from bs4 import BeautifulSoup
from selenium import webdriver

driver = webdriver.Firefox()
driver.implicitly_wait(10) # seconds
driver.get("http://zoeken.mol.bibliotheek.be/?itemid=|library/marc/vlacc|9394694&undup=false")

html = driver.page_source
soup = BeautifulSoup(html)

bal = soup.find(class_="avail-icon")
print(bal)

结果仍然相同,class =&#34; circle-icon avail-icon-unknown&#34;不是我正在寻找的东西,我现在已经没有想法了。有人可以给我一个暗示吗?

PS:也许是个主意,但我不知道怎么做: 在Firefox中,在元素检查器中,右窗格有一个名为rules(dutch:regels)的列。红色和绿色图标作为一个.png文件(icon-sprite.png)加载。选择红色/绿色图标以查看我的意思。

background-position:-48px -16px;表示可用(绿色图标)

background-position:0px -32px;表示不可用(红色图标)

我可以以某种方式测试吗?

PS2:我是新手程序员(技能等级=低)。

1 个答案:

答案 0 :(得分:0)

您可以完全使用硒来完成此操作:

final case class Validation(ql: Option[SqlDataSource])
final case class SqlDataSource(dfh: Option[DataFrameHolder])
final case class DataFrameHolder(sql: Option[String])

val expVal = Validation(
    ql = Some(
      SqlDataSource(
        dfh = Some(
          DataFrameHolder(
            sql = Some("Hello, World!")
          )
        )
      )
    )
  )


implicit class OptionOps[T](private val op: Option[T]) {
  def toTry(ex: => Throwable): Try[T] = op match {
    case Some(t) => Success(t)
    case None    => Failure(ex)
  }
}

val ssql: Try[String] = for {
  ql <- expVal.ql.toTry(new IllegalStateException("CompareDF: Missing sql container"))
  dfh <- ql.dfh.toTry(new IllegalStateException("CompareDF: dfh missing sql"))
  sql <- dfh.sql.toTry(new IllegalStateException("CompareDF: Missing sql"))
} yield sql