【问题标题】:Get list of titles from h3 class name with Selenium使用 Selenium 从 h3 类名中获取标题列表
【发布时间】:2021-06-28 09:20:03
【问题描述】:

我在激活搜索功能后尝试获取标题列表,但即使在查找 h3 类标题的各种迭代时路径正确,我仍然得到一个空列表。请参阅下面的示例,说明我要复制的一个标题位于 HTML 中的位置。类类型每次都在变化,但位置总是在h3之内。

所以我尝试使用下面的代码来提取标题列表:

import pandas as pd
from selenium import webdriver
from webdriver_manager.firefox import GeckoDriverManager
from selenium.webdriver.firefox.options import Options

options = Options()
options.set_preference("dom.push.enabled", False)
browser = webdriver.Firefox(options=options)

browser.get("https://medium.com/search")
browser.find_element_by_xpath("//input[@type='search']").send_keys("Flying elephant",Keys.ENTER)
titles = browser.find_elements_by_xpath("//h3[contains(@class,'graf')]")

lista = []
for names in titles:
    print(names.text)
    lista.append(names.text)     

browser.quit()

代码运行,但我返回的列表没有任何元素。感谢您提供任何帮助我解决此问题的提示

【问题讨论】:

  • 也许尝试获取"//h3" 并检查它是否具有class 以及它在class 中的值。一些服务器可能会在类中使用随机值,并为不同的用户创建不同的值。
  • 是的,我确实通过检查源找到了它,并且有一个常量类值。下面的解决方案解决了我的问题。
  • 我要求用 selenium 检查它 - 而不是通过手动检查源。您还可以查看browser.page_source 以了解您在 selenium 中真正得到了什么。但我看到你已经得到了答案。等待数据通常是检查问题的第二步(因为 JavaScript 需要一些时间来添加 HTML)
  • 这是一个很好的提示,page_source 的问题是我得到一个文本转储而不是一个很好的 html 结构,你知道是否有一个命令我可以运行来查看它是层次感的结构吗?
  • 您可以将page_sourceBeautifulSouplxml 一起使用,其中一些可能具有重新格式化它的功能。但是 HTML 可能在某些地方有新行 \n,这些功能即使在重新格式化后也可能会保留它们,并且看起来不像您期望的那样。

标签: python html selenium web-scraping webdriverwait


【解决方案1】:

您需要在搜索后等待元素可见。 使用WebDriverWait() 并等待visibility_of_all_elements_located()

browser.get("https://medium.com/search")
browser.find_element_by_xpath("//input[@type='search']").send_keys("Flying elephant",Keys.ENTER)
titles =WebDriverWait(browser,20).until(EC.visibility_of_all_elements_located((By.XPATH,"//h3[contains(@class,'graf')]")))

lista = []
for names in titles:
    print(names.text)
    lista.append(names.text) 
print(lista)

您需要导入以下库。

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

输出

['A Flying Elephant, a Teacher’s Hugs: 12 Tales of Pandemic Resilience', 'Who Knew Disney Could Do Trippy Even Better Than Pink Floyd?', '#FlightFree2020: Travel Blogging And The Multiplier Effect', 'Bluesky and Dumbo ‘The Flying Elephant’', 'The Flying Elephant. A Tank So Heavy The British Decided Not To Build It.', 'The Flying Elephant. A Tank So Heavy The British Decided Not To Build It.']

【讨论】:

  • 谢谢,为什么我们需要双方程:titles =allelements=...?这也可以通过简单地使用一个等效标题=...
  • @Nicola :这是一个错字。我已经更新了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-01
  • 2020-11-29
  • 2016-08-30
  • 2022-08-14
  • 1970-01-01
  • 2021-01-05
  • 2014-10-19
相关资源
最近更新 更多