BeautifulSoup:从网站获取信息(父母/子女问题?)

时间:2017-08-03 08:00:48

标签: python-3.x beautifulsoup web-crawler

我是网络爬行的新手,我遇到了一个问题。

我希望从此页面获得2个信息: https://boardgamegeek.com/boardgame/197070/massive-darkness

我想要的信息是:

  
      
  • 最少的球员数
  •   
  • 最多玩家数
  •   

我在" 1-6玩家"上做了一个严厉的陈词滥调。去"检查"我得到了:

<div class="gameplay-item-primary">                     <!----><span ng-if="::geekitemctrl.geekitem.data.item.minplayers > 0 || geekitemctrl.geekitem.data.item.maxplayers > 0" min="::geekitemctrl.geekitem.data.item.minplayers" max="::geekitemctrl.geekitem.data.item.maxplayers">     <!----><span ng-if="min > 0">1</span><!----><!----><span ng-if="max>0 &amp;&amp; min != max"><!----><span ng-if="min>0">–</span><!---->6</span><!----> </span><!---->                    Players                 </div>

我试过了:

url=requests.get('https://boardgamegeek.com/boardgame/197070/massive-darkness')
website=url.content
soup = BeautifulSoup(website, "html.parser")
tmp=soup.find("div",{"class":"gameplay-item-primary"})

但是tmp的类型是None(而不是class&#39; bs4.element.Tag&#39;) - &gt;它里面没有任何信息,我也不知道为什么......

  

问题1:我如何获得我想要的2个信息?

     

问题2:&#34;!----&#34;装置

     

问题3:当我只做soup.find("div")时,我会上课&#39; bs4.element.Tag&#39;对象,但我仍然不知道从哪里获取我的信息...

1 个答案:

答案 0 :(得分:1)

因此,正如我们已经发现所需的页面使用动态js生成的内容一样,解决方案将更加困难,但我们不需要进行大量更改。
现在我们需要在您的计算机上安装selenium webdriver和selenium服务器。使用此linkthis(如果您要在服务器上执行过程)。
但是现在只需输入您的控制台:
pip3 install selenium chromedriver
现在我们必须在控制台中运行chromedriver。
只需输入chromedriver

比你的整个脚本应该是这样的:

from selenium import webdriver
import urllib3
import certifi
from bs4 import BeautifulSoup as bs


class Scrapper:
    def __init__(self):
      self.http = urllib3.PoolManager(cert_reqs='CERT_REQUIRED', ca_certs=certifi.where())
      #below we define our chrome driver.
      self.options = webdriver.ChromeOptions()
      self.options.add_argument('headless')
      self.options.add_argument('window-size=1200x600')
      self.driver = webdriver.Chrome(chrome_options=self.options)

    def page_process(self, url):
      self.driver.get(url)
      self.driver.implicitly_wait(2)
      return self.driver.page_source

    def parse_element(self, element):
      return bs(element, 'html.parser')

class Job(Scrapper):
  def __init__(self):
     super().__init__()

  def parse_process(self, url):
      source_page = super().page_process(url)
      parsed_page = super().parse_element(source_page)

      divs_on_page = parsed_page.find_all("div",{"class":"gameplay-item-primary"})
      your_div = divs_on_page[0]
      your_text = your_div.get_text()
      players_arr = your_text.split('-')
      min_players = players_arr[0]
      max_players = players_arr[1]



 url = "https://boardgamegeek.com/boardgame/197070/massive-darkness"
 b = Job()
 b.parse_process(url)