【问题标题】:Hidden element can not found by BeautifulsoupBeautifulsoup 找不到隐藏元素
【发布时间】:2020-10-16 13:05:18
【问题描述】:

当我打印出(样本)它显示一个空列表或无时可以帮助我 我认为缺少一些标签。

import requests
from bs4 import BeautifulSoup
class scrape:
    def __init__(self):
        self.content=None
        self.soup=None 
        self.samples=None 
        self.lastSamples=None 
        self.numbers=None
    def Download(self):
        results=requests.get("https://www.bet.co.za/bet-games/")
        print(results)
        if results.status_code==200:
           self.content=results.content
        else:
            
           raise Exception("Download: Could not fetch data")
    def findSoupSamples(self):
        self.soup=BeautifulSoup(self.content,"html.parser")
        self.samples=self.soup.find('div',{'class':'game-result'})
        print(self.samples)

【问题讨论】:

标签: python web-scraping beautifulsoup


【解决方案1】:

使用Selenium 控制加载页面和运行 JavaScript 的 Web 浏览器的最小示例。

因为 JavaScript 需要一些时间来添加元素,所以我使用 time.sleep(10) 但你可以使用特殊函数来等待元素。见Waits

因为div.game-result<iframe> 内部,所以首先我必须找到iframe 并切换到这个iframe。在示例中,我检查了所有 iframe,但您只能使用 all_iframes[1] 来获取元素。

Selenium有很多功能find_element_by_...find_elements_by_... to search elements in HTML so you could do it without BeautifulSoup`

import selenium.webdriver
from bs4 import BeautifulSoup
import time

driver = selenium.webdriver.Firefox()
driver.get("https://www.bet.co.za/bet-games/")

time.sleep(10)

all_iframes = driver.find_elements_by_tag_name('iframe')
print('len(all_iframes):', len(all_iframes))

for number, iframe in enumerate(all_iframes):
    print('--- iframe', number, '---')
    
    driver.switch_to.frame(iframe)

    soup = BeautifulSoup(driver.page_source, "html.parser")
    samples = soup.find_all('div', {'class': 'game-result'})
    print('len(samples):', len(samples))

    for item in samples:
        print(item.get_text(separator=','))
    
    driver.switch_to.default_content()

结果:

len(all_iframes): 4
--- iframe 0 ---
len(samples): 0
--- iframe 1 ---
len(samples): 5
13,15,35,21,4
3,14,4,25,33
25,34,14,4,8
30,18,25,24,10
35,30,5,34,21
--- iframe 2 ---
len(samples): 0
--- iframe 3 ---
len(samples): 0

编辑:类似的版本有一个iframe,没有BeautifulSoup

import selenium.webdriver
import time

driver = selenium.webdriver.Firefox()
driver.get("https://www.bet.co.za/bet-games/")

time.sleep(10)

all_iframes = driver.find_elements_by_tag_name('iframe')
driver.switch_to.frame(all_iframes[1])

all_samples = driver.find_elements_by_css_selector('div.game-result')
print('len(all_samples):', len(all_samples))

for sample in all_samples:
    all_balls = sample.find_elements_by_css_selector('span.ball-item')
    all_text = [ball.text for ball in all_balls]
    print(','.join(all_text))

结果:

len(all_samples): 5
13,1,12,2,10
13,14,33,26,4
21,18,12,9,4
13,15,35,21,4
3,14,4,25,33

顺便说一句: 有时页面会显示视频而不是这些数字,然后代码可能会给出空字符串。等待视频结束可能需要更复杂的代码。


编辑:

要更改游戏,您必须找到指向Lucky 7click() 的链接

all_titles = driver.find_elements_by_css_selector('div.game-title')
all_titles[6].click()

最小的工作示例

import selenium.webdriver
import time

driver = selenium.webdriver.Firefox()
driver.get("https://www.bet.co.za/bet-games/")

time.sleep(10)

all_iframes = driver.find_elements_by_tag_name('iframe')
driver.switch_to.frame(all_iframes[1])

all_titles = driver.find_elements_by_css_selector('div.game-title')
print('len(all_titles):', len(all_titles))
# click on link to `Lucky 7`
all_titles[6].click()
time.sleep(1)

all_samples = driver.find_elements_by_css_selector('div.game-result')
print('len(all_samples):', len(all_samples))

for sample in all_samples:
    all_balls = sample.find_elements_by_css_selector('span.ball-item')
    all_text = [ball.text for ball in all_balls]
    print(','.join(all_text))

顺便说一句:

通常你也可以使用文本

link = driver.find_element_by_link_text('Lucky 7')
link.click()

但这个元素不在<a> 中,所以它不起作用。

但有效:

link = driver.find_element_by_xpath('//*[text()="Lucky 7"]')
link.click()

【讨论】:

  • 谢谢先生,但我想提取luck7,而不是luck5
  • 你没有说它有问题。您必须找到指向lucky7.click() 的链接。 Selenium 有许多不同的功能find_elements_by_... 来搜索元素。
猜你喜欢
  • 2021-10-24
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多