【问题标题】:BeautifulSoup: get information from website (parent/child issue?)BeautifulSoup:从网站获取信息(父/子问题?)
【发布时间】:2017-08-03 08:00:48
【问题描述】:

我是网络爬虫新手,但遇到了问题。

我想从这个页面获取 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 'bs4.element.Tag') --> 里面没有信息,我也不知道为什么......

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

问题2:“!----”是什么意思?

问题 3:当我只做 soup.find("div") 时,我得到一个类 'bs4.element.Tag' 对象,但我仍然不知道从哪里获取我的信息...

【问题讨论】:

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


    【解决方案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)
    

    【讨论】:

    • 感谢您的回答。我确实使用了 BeautifulSoup4,但我不使用 urllib3 .....我尝试了你的代码,即使我不理解它(我是新手)。但是我没有“Scrapper”,“pip install Scrapper”错误,并且“conda install Scrapper”没有找到它......所以我被卡住了:-)我会尝试重新提出我的问题简单的方法。还是非常感谢! :-)
    • 嗨 Grynets,我不明白你的问题....什么应该是正确的?此外,我处理您的代码。 Scrapper 不存在,但 scraper 存在....所以我安装它并更正您的代码。但是我仍然遇到一些错误:“TypeError: module.__init__() 最多接受 2 个参数(给定 3 个)”。我在 python3 上工作,也许这就是为什么....
    • 顺便说一句,我尝试使用您的代码:parse_process(self, 'https://boardgamegeek.com/boardgame/197070/massive-darkness/marketplace/geekmarket') 也许这不是正确的方式
    • Scrapper 这是您在第一个代码块中创建的自定义类。你不需要安装任何东西。
    • 这是我首先理解的,但是在运行包含您的第一个代码的第一个单元格之后。我试图运行包含您的第二个代码的第二个单元格,但出现错误:ModuleNotFoundError: No module named 'Scrapper'... :-(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多