【问题标题】:Can't find div class while webscraping on Python using selenium使用 selenium 在 Python 上进行网络抓取时找不到 div 类
【发布时间】:2020-07-06 06:08:17
【问题描述】:

首先我会说我已经看到了类似的问题,但没有一个解决方案对我有用

所以我在我的 html 页面中寻找一个特定的类,但我总是得到一个 None 值返回。我在这里看到了一些描述相同问题的帖子,但没有一个解决方案对我有用。这是我的尝试 - 我正在寻找带有名字的玩家标签,即'Chase Young'

from selenium import webdriver
from bs4 import BeautifulSoup
import pandas as pd
import requests

url = "https://www.nfl.com/draft/tracker/prospects/allPositions?
college=allColleges&page=1&status=ALL&year=2020"

soup = BeautifulSoup(url.content, 'lxml')
match = soup.find('div', class_ = 'css-gu7inl')
print(match)
# Prints None

我尝试了另一种方法来查找匹配项,仍然返回无:

match = soup.find("div", {"class": "css-gu7inl"} # Print match is None

html 文件似乎不包含所有网页,所以我尝试使用 selenium,因为我在类似帖子中看到过推荐,但仍然一无所获:

driver = webdriver.Chrome("chromedriver")
driver.get(url)
soup = BeautifulSoup(driver.page_source, 'lxml')
items=soup.select(".css-gu7inl")
print(items) # Empty list

我在这里做错了什么?

【问题讨论】:

  • 我检查了 selenium 方法,它确实给出了您正在寻找的结果,您最终面临什么问题?
  • 我不知道为什么它对你有用。我重新运行了代码,但我仍然得到一个空列表
  • 我想下面的答案应该可以工作,基本上你需要等到浏览器加载所有内容,然后你需要解析 HTML 以从中获取内容。可能是当您从代码中点击时,它仍在加载内容,这就是为什么您没有得到 div 的结果。

标签: python selenium xpath beautifulsoup python-requests


【解决方案1】:

数据由 java 脚本渲染,因此诱导 WebDriverWait() 并使用 visibility_of_all_elements_located() 等待元素可见

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup

url='https://www.nfl.com/draft/tracker/prospects/allPositions?college=allColleges&page=1&status=ALL&year=2020'
driver = webdriver.Chrome()
driver.get(url)
WebDriverWait(driver,20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR,'.css-gu7inl')))
soup = BeautifulSoup(driver.page_source, 'lxml')
items=soup.select(".css-gu7inl")
Players=[item.select_one('a.css-1fwlqa').text for item in items]
print(Players) 

输出

['chase young', 'jeff okudah', 'derrick brown', 'isaiah simmons', 'joe burrow', "k'lavon chaisson", 'jedrick wills', 'tua tagovailoa', 'ceedee lamb', 'jerry jeudy', "d'andre swift", 'c.j. henderson', 'mekhi becton', 'mekhi becton', 'patrick queen', 'henry ruggs iii', 'henry ruggs iii', 'javon kinlaw', 'laviska shenault jr.', 'yetur gross-matos']

【讨论】:

  • 成功了!你能解释一下我的代码没有做什么吗?难道只是在我导入页面时,它还没有完全呈现吗?
  • @StevenCunden :是的,你是正确的。你需要使用显式等待来正确加载元素。
【解决方案2】:

代码 1 可帮助您查看来自服务器的响应。 此响应包含服务器发送的 HTML 代码。 用另一个代码分析这段代码的响应(来自服务器的 HTML 代码)并分离出你想要的类。

================================================ ===

import requests #CODE1
from requests_toolbelt.utils import dump

resp = requests.get('http://kanoon.ir/')
data = dump.dump_all(resp)
print(data.decode('utf-8')) 

================================================ ====

代码输出:HTML代码:

< GET / HTTP/1.1

< Host: kanoon.ir

< User-Agent: python-requests/2.23.0

< Accept-Encoding: gzip, deflate

< Accept: */*

< Connection: keep-alive

< 
     ...

================================================ ====

您为第二部分(用于分析和 HTML 代码分离)编写的代码取决于您的创造力。

【讨论】:

    猜你喜欢
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 2018-07-20
    • 2020-03-13
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多