【问题标题】:Web Scraping using BeautifulSoup, click on element for hidden tab使用 BeautifulSoup 进行网页抓取,单击隐藏选项卡的元素
【发布时间】:2021-03-15 03:05:00
【问题描述】:

我在尝试捕获页面内的特定信息时遇到问题。

网址:https://www.target.com/p/prairie-farms-vitamin-d-milk-1gal/-/A-47103206#lnk=sametab

在此页面上,我想要抓取的“关于此商品”下的“详细信息”选项卡旁边有名为“标签信息”、“运输和退货”、“问答”的隐藏选项卡.

我发现在使用 Beautifulsoup 进行 scraping 之前,我需要点击这些元素。

这是我的代码,假设我有每个链接的 pid。


    url = 'https://www.target.com' + str(pid)
    
    driver.get(url)
    driver.implicitly_wait(5)
    
    soup = bs(driver.page_source, "html.parser")
    wait = WebDriverWait(driver, 3)
    
    button = soup.find_all('li', attrs={'class': "TabHeader__StyledLI-sc-25s16a-0 jMvtGI"})
    
    index = button.index('tab-ShippingReturns')
    print('The index of ShippingReturns is:', index)
    
    if search(button, 'tab-ShippingReturns'):
       button_shipping_returns = button[index].find_element_by_id("tab-ShippingReturns")
       button_shipping_returns.click()
    time.sleep(3)

我的代码返回 ResultSet 对象没有属性“find_element_by_id”。您可能将元素列表视为单个元素。当你打算调用 find() 时,你调用了 find_all() 吗?

谁能指导我如何解决这个问题?

【问题讨论】:

  • 这是 scrape 而不是 scrap

标签: python beautifulsoup web-crawler


【解决方案1】:

似乎您尝试交互的按钮通过在末尾添加唯一值来动态生成类,我建议使用 xpath 选择器类型的 contains() 方法,例如:

driver.find_elements_by_xpath("//a[contains(@class,'TabHeader__Styled')]")

所以,你的代码应该是这样的:

   elements = driver.find_elements_by_xpath("//a[contains(@class,'TabHeader__Styled')]")
   for el in elements:
       el.click()

点击页面已经存在的按钮并不可怕

如果元素不可见需要向下滚动,可以使用ActionChains:

from selenium.webdriver import ActionChains
ActionChains(driver).move_to_element(el).perform()

所以代码看起来像这样,只是你的元素解析器:

from selenium import webdriver
from selenium.webdriver import ActionChains

driver = webdriver.Chrome()
url = 'https://www.target.com/p/prairie-farms-vitamin-d-milk-1gal/-/A-47103206#lnk=sametab'
driver.get(url)
driver.implicitly_wait(5)

elements = driver.find_elements_by_xpath("//a[contains(@class,'TabHeader__Styled')]")
for el in elements:
    ActionChains(driver).move_to_element(el).perform()
    el.click()

driver.quit()

【讨论】:

    【解决方案2】:

    以下

    button = soup.find_all('li', attrs={'class': "TabHeader__StyledLI-sc-25s16a-0 jMvtGI"})
    

    将返回一个 BeautifulSoup 标签列表。

    然后您尝试使用以下命令调用该列表中的 selenium 方法:

    button_shipping_returns = button[index].find_element_by_id("tab-ShippingReturns")
    

    相反,您需要在 webdriver 元素集合上调用它

    driver.find_elements_by_css_selector('.TabHeader__StyledLI-sc-25s16a-0 jMvtGI')[index].find_element_by_id("tab-ShippingReturns")
    

    【讨论】:

    • 谢谢,QHarr 我发现它仍然有一条错误消息,但我用下面的 Vova 代码解决了这个问题。感谢您的帮助和支持。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 2021-01-31
    相关资源
    最近更新 更多