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

我是网络抓取的新手,并使用了 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 触发事件或其他东西?我什至没有点击列表中列出的任何链接,甚至没有保留链接列表,我只需要计算有多少链接开始。


慕田峪9158850
浏览 131回答 3
3回答

九州编程

你不需要硒的费用。您可以对页面执行相同的 GET 请求,然后从返回的 json 中提取 html 并使用 bs4 解析并提取链接import requestsfrom bs4 import BeautifulSoup as bsr = 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)

炎炎设计

我已经抓取了您的页面并编写了一个 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 个结果:

慕斯709654

获取所有的anchor 标签下的Staff Lists that Include that TitleinduceWebDriverWait和 presence_of_all_elements_located() 这会给你100 个链接。from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECdriver=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:&nbsp; &nbsp; print(ele.get_attribute('href'))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript