为了账号安全,请及时绑定邮箱和手机立即绑定

使用 selenium 和 beautifulsoup 进行网页抓取时

使用 selenium 和 beautifulsoup 进行网页抓取时

慕田峪9158850 2021-11-04 15:40:41
我是网络抓取的新手,并使用了 beautifulsoup 和 selenium。我正在尝试从以下网页抓取数据:    https://epl.bibliocommons.com/item/show/2300646980我正在尝试抓取以下部分:“包含该职位的员工名单”。特别是,我想获取<li>标签的数量,因为我只需要该员工列表中的项目/链接数量。我已经在“检查”页面提供的 HTML 代码上尝试了以下内容。以下是我试图从中抓取的 HTML 代码块:<div class="ugc_bandage">  <div class="lists_heading clearfix">    <h3 data-test-id="ugc-lists-heading">      Listed    </h3>    <div class="ugc_add_link">      <div class="dropdown saveToButton clearfix" id="save_to_2300646980_id_7a3ateh0panp1uv0he1v7aqmj9" data-test-id="add-to-list-dropdown-container">  <a href="#" aria-expanded="false" aria-haspopup="true" class=" dropdown-toggle dropdown-toggle hide_trigger_icon" data-test-id="add-to-list-save-button" data-toggle="dropdown" id="save_button_2300646980_id_7a3ateh0panp1uv0he1v7aqmj9" rel="nofollow">       <i aria-hidden="true" class=" icon-plus"></i><span aria-hidden="true">Add</span><span class="sr-only" data-js="sr-only-dropdown-toggle" data-text-collapsed="Add, collapsed" data-text-expanded="Add, expanded">Add, collapsed</span><span aria-hidden="true" class="icon-arrow"></span></a>    <ul class="dropdown-menu">      <li>        <a href="/user_lists/new?bib=2300646980&amp;origin=https%3A%2F%2Fepl.bibliocommons.com%2Fitem%2Fload_ugc_content%2F2300646980" class="newList">Create a New List</a>      </li>      <li>        <a href="/lists/add_bib/mine?bib=2300646980_fangirl" data-js="cp-overlay" id="more_lists_id_7a3ateh0panp1uv0he1v7aqmj9">Existing Lists »</a>      </li>  </ul></div>我已经使用 xpath 抓取了上面的代码,从检查人员列表部分 ( id="all_lists_expand")复制而来:    element = driver.find_elements_by_xpath('//*[@id="rightBar"]/div[3]/div')我尝试通过使用类名抓取来抓取该部分:    element = driver.find_element_by_class_name('expand clearfix')我还尝试使用 css 选择器进行抓取:    element = driver.find_element_by_css_selector('#all_lists_expand')我还做了上面代码的其他变体,寻找元素的父类、xpaths 等。以上所有尝试都返回NONE。我不确定我做错了什么,我是否应该使用 selenium 触发事件或其他东西?我什至没有点击列表中列出的任何链接,甚至没有保留链接列表,我只需要计算有多少链接开始。
查看完整描述

3 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

你不需要硒的费用。您可以对页面执行相同的 GET 请求,然后从返回的 json 中提取 html 并使用 bs4 解析并提取链接


import requests

from bs4 import BeautifulSoup as bs


r = requests.get('https://epl.bibliocommons.com/item/load_ugc_content/2300646980').json()

soup = bs(r['html'], 'lxml')

links = [i['href'] for i in soup.select('[data-test-id="staff-lists-that-include-this-title"] + div [href]')]

print(len(links))

print(links)


查看完整回答
反对 回复 2021-11-04
?
炎炎设计

TA贡献1808条经验 获得超4个赞

我已经抓取了您的页面并编写了一个 XPath,它将找到li“包含此职位的员工列表”下的所有元素。更新为包含wait所有相关li元素的a 。


WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPath, "//div[h4[text()='Staff Lists that include this Title']]/div[2]/ul/li[@class='']")))

driver.find_elements_by_xpath("//div[h4[text()='Staff Lists that include this Title']]/div[2]/ul/li[not(contains(@class, 'extra'))]")

此 XPath 查询包含文本“包含此职位的员工列表”的元素下的div所有li项目的主元素h4。然后我们查询div[2]哪些包含相关li项目。最后的查询是针对li具有 EMPTY 类名的元素。从页面源码中可以看出,有很多隐藏的li带有class='extra'属性的元素。我们不想要这些li元素,因此我们继续查询not(contains(@class=, 'extra'))以获取li没有extra类名的元素。


如果上述 XPath 不起作用,我还修改了您在原始问题中发布的另一个 XPath:


WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPath, "//*[@id="rightBar"]/div[3]/div/div[2]/ul/li[not(contains(@class, 'extra'))]")))

driver.find_elements_by_xpath("//*[@id="rightBar"]/div[3]/div/div[2]/ul/li[not(contains(@class, 'extra'))]")

对于您提供的 URL,两个查询都检索了 5 个结果:

//img1.sycdn.imooc.com//61838fa50001a8dc19020768.jpg

查看完整回答
反对 回复 2021-11-04
?
慕斯709654

TA贡献1840条经验 获得超5个赞

获取所有的anchor 标签下的Staff Lists that Include that TitleinduceWebDriverWait和 presence_of_all_elements_located() 这会给你100 个链接。


from selenium import webdriver

from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC


driver=webdriver.Chrome()

driver.get("https://epl.bibliocommons.com/item/show/2300646980")

elements=WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.XPATH,'//h4[@data-test-id="staff-lists-that-include-this-title"]/following::div[1]//li/a')))

print(len(elements))

for ele in elements:

    print(ele.get_attribute('href'))


查看完整回答
反对 回复 2021-11-04
  • 3 回答
  • 0 关注
  • 130 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信