【问题标题】:Scraper unable to extract titles from a websiteScraper 无法从网站中提取标题
【发布时间】:2017-08-01 09:03:50
【问题描述】:

我在 python 中结合 Selenium 编写了一个脚本来提取显示在 Finance.yahoo 网站左侧栏中的不同新闻的标题。我使用 css 选择器来获取内容。但是,该脚本既没有给出任何结果,也没有抛出任何错误。我无法弄清楚我正在犯的错误。希望有人会调查一下。提前致谢。

这是我的脚本:

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://finance.yahoo.com/")
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "u.StretchedBox")))
for item in driver.find_elements_by_css_selector("u.StretchedBox span"):
    print(item.text)   
driver.quit()

标题所在的元素:

<h3 class="M(0)" data-reactid="128"><a rel="nofollow noopener noreferrer" class="Fw(b) Fz(20px) Lh(23px) LineClamp(2,46px) Fz(17px)--sm1024 Lh(19px)--sm1024 LineClamp(2,38px)--sm1024 Td(n) C(#0078ff):h C(#000)" target="_blank" href="https://beap.gemini.yahoo.com/mbclk?bv=1.0.0&amp;es=bVwDtPMGIS8NDKqncZWZBjLsQQHm58Z9cLJuMqC6LadDlYfVCoy.d3GqO599EPAiYnsxB0SB8aRURPve9Q8mOEjH.NrcVcVDhldut.C_9Vn16XER1q1G07a48FMQ_.sv9GCyVx7zcj1kBtWPysaYzQqboJWgUo5DRRHbAnejwVtYRPHJTEptil92tx_ccJZ9FnxE8L3tfDuS0Q3l5ftVhamTOon_nzuvtvqqBwD7X0T.7Z3wZBgtH93gM1xImZ0hdFUzsuQPDAjZWs1KdH0YsXIf3uLrmcJFoI9leh8KRljnIPC.RdhOF6OYcJfHtDks85nSIgfOsMyUr1wEhMA2Qa2htpEg5w.P4UIXeoldjzJ_NsUrtXqEFIJNKoaeq_FNiQ9wcI16utKO87167zkfSPzVY09d3pVLZg20V7tqTThOkG_IakPnmlOriJKnufsBWj1wp.6Q4PasAt2g4Y1yw9U71FIfG2dDwpryRKDWrUBfTvjwwItlSyXyvWvIYUyXXxR74qWcIEC3KAvVN7.iqSckV_EssVM8ytp5HiN4iTACpEmc96rpdNEqHYpRotwze8NF5cDubsZbW58Hauq_aO.DbhZJ7TbBDx5vZK_M%26lp=https%3A%2F%2Fin.search.yahoo.com%2Fsearch%3Fp%3Dcheap%2Bairfare%2Bdomestic%26fr%3Dstrm-tts-thg%26.tsrc%3Dstrm-tts-thg%26type%3Dcheapairfaredomestic-in" data-reactid="129">


<u class="StretchedBox" data-reactid="130"></u>

<span data-reactid="131">The Cheapest Domestic Airfare Rates</span></a></h3>

【问题讨论】:

  • 我在网站上的u 中看不到任何span。你能把你感兴趣的值截图吗?

标签: python selenium selenium-webdriver web-scraping


【解决方案1】:

您既没有得到错误也没有得到结果,因为:

  • find_elements_...() 方法打算返回一个list。如果您的选择器不匹配任何元素,您将不会收到错误,只是一个空列表。此外,如果尝试遍历空列表,您将不会收到错误
  • 您的 CSS 选择器应该匹配 span,它是具有属性 class="StretchedBox"u 的后代,但实际上需要的 span 不是后代,而是兄弟 .

尝试使用以下代码:

for item in driver.find_elements_by_css_selector("u.StretchedBox+span"):
    print(item.text)  

【讨论】:

  • 感谢安德森爵士的回答。你的回答总是让我惊讶。它确实获取了上面的标题,但不是我想要的所有标题。
  • 似乎并非所有标题都位于 span 中。尝试使用 XPath 而不是 CSS 选择器://a[u[@class="StretchedBox"]]
  • 再一次,您让我目瞪口呆,先生。它成功了。你总是想出新的东西。您能否让我用一个简单的解释来理解 - 为什么“方括号”中的“u”标签?再次感谢先生。
  • XPath 表示您要匹配包含下划线标记 (a[u]) 的锚标记 (a),其中包含具有适当值 (u[@class="StretchedBox"]) 的 class 属性。当您想要获得与其子元素匹配的父元素时,这是常见的情况。例如,//div/a/span 返回您 span 与祖先匹配,但 //div[a[span]] 返回您 div 与后代匹配
  • 现在是水晶。会记在心里的。再次感谢先生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2019-10-24
  • 2019-01-05
相关资源
最近更新 更多