【问题标题】:Why Does My Code Scrape The First Record Only?为什么我的代码只抓取第一条记录?
【发布时间】:2021-07-26 01:08:38
【问题描述】:

我的代码进入一个网站,点击导致下拉的记录。

我当前的代码只打印第一个下拉记录,而不打印其他记录。

例如,网页的第一条记录被点击时,下拉1条记录。该记录显示为附件。这也是第一个也是唯一一个作为我的输出打印的下拉记录。

代码打印这个

如何让它拉出所有下拉标题?

from selenium import webdriver
import time
driver = webdriver.Chrome()


for x in range (1,2):
    driver.get(f'https://library.iaslc.org/conference-program?product_id=24&author=&category=&date=&session_type=&session=&presentation=&keyword=&available=&cme=&page={x}')
    time.sleep(4)
    productlist_length = len(driver.find_elements_by_xpath("//div[@class='accordin_title']"))
    
for i in range(1, productlist_length + 1):

        product = driver.find_element_by_xpath("(//div[@class='accordin_title'])[" + str(i) + "]")
        title = product.find_element_by_xpath('.//h4').text.strip()
        print(title)

        buttonToClick = product.find_element_by_xpath('.//div[@class="sign"]')
        buttonToClick.click()
        time.sleep(5)

        subProduct=driver.find_element_by_xpath(".//li[@class='sub_accordin_presentation']")
        otherTitle=subProduct.find_element_by_xpath('.//h4').text.strip()
        print(otherTitle)

【问题讨论】:

  • 你明白range(1,2) 只产生一个元素“1”吗?如果你想要数字 1 和 2,就说for x in (1,2):
  • 我的那部分代码是针对页数的。如果您查看它下面的行,它只适用于 URL。它不会影响我所指的问题。
  • 你能显示一个示例输出吗? “仅第一条记录”可以表示多种含义,例如只有一个输出作为一个记录,或者有多个输出重复同一记录。
  • @burningalc 示例现已附加。
  • productlist_length 的值是否正确?

标签: python selenium-webdriver web-scraping xpath css-selectors


【解决方案1】:

你根本不需要硒。不确定您所追求的所有信息是什么,但以下内容向您展示了这些扩展块内的内容可用,并带有来自简单的requests.get() 的响应。:

import requests
from bs4 import BeautifulSoup as bs
import re

r = requests.get('https://library.iaslc.org/conference-program?product_id=24&author=&category=&date=&session_type=&session=&presentation=&keyword=&available=&cme=&page=1')
soup = bs(r.text, 'lxml')
sessions = soup.select('#accordin > ul > li')

for session in sessions:
    print(session.select_one('h4').text)
    sub_session = session.select('.sub_accordin_presentation')
    if sub_session:
        print([re.sub(r'[\n\s]+', ' ', i.text) for i in sub_session])
    print()
    print()

【讨论】:

  • 您似乎可以完美地做到这些,有什么课程或您推荐的东西吗?
  • 学习一些html,学习如何使用浏览器的元素和网络标签。
【解决方案2】:

试试:

productlist_length = len(driver.find_elements_by_xpath('//*[@class="jscroll-inner"]/ul/li'))
for product in productlist_length:
    title = product.find_element_by_xpath('(.//*[@class="accordin_title"]/div)[3]/h4').text
    

【讨论】:

  • 对于 productlist_length 中的产品:TypeError: 'int' object is not iterable 是我得到的错误
  • 移除 'len' 功能
  • 是的,当我删除 len 时它可以工作。但是,仍然只拉第一个下拉:l
  • 更新,我将 subproduct=driver.find_element_by_xpath 行更改为 -> subproduct=product.find_element_by_xpath 并且通过抓取每条记录的第一个下拉菜单似乎效果更好。有一些记录,有很多下拉菜单。所以代码还是需要抓取所有元素
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-04
  • 1970-01-01
相关资源
最近更新 更多