首页 > 解决方案 > 如果有相同类名的跨度,如何抓取跨度类文本?

问题描述

[检查 youtube 屏幕的图像][1]

我想抓取突出显示的跨度类的文本。但问题是上面的跨度类与下面的具有相同的属性,就像两者一样,具有相同的类名,所以当我使用 bs4 使用 find() 编写代码时,它只抓取第一个跨度类的文本。所以请帮我解决这个问题,(在 python 中建议)[1]:https ://i.stack.imgur.com/mCqDp.png

标签: pythonhtmlweb-scrapingbeautifulsoup

解决方案


如何获得元“创建......之前”?

像往常一样,不仅有一种方法,我建议您将信息作为子元素查找:nth-of-type()

soup.select("[id='metadata-line'] > span:nth-of-type(2)")

按其类型选择父元素id和其中的第二个元素<span>

这将为您提供必须循环的所有元素的列表,以获取每个文本:

for item in soup.select("[id='metadata-line'] > span:nth-of-type(2)"):
    print(item.get_text())

如果您仍处于遍历所有搜索结果的循环中,则可能会使用select_one()会给您单个项目而不是列表的内容,您可以get_text()直接:

soup.select_one("[id='metadata-line'] > span:nth-of-type(2)").get_text()

例子

from selenium import webdriver
from bs4 import BeautifulSoup
from time import sleep

driver = webdriver.Chrome(executable_path='C:\Program Files\ChromeDriver\chromedriver.exe')
url = "https://www.youtube.com/results?search_query=data+science"

driver.get(url)
sleep(5)

soup = BeautifulSoup(driver.page_source, "lxml")

for item in soup.select("[id='metadata-line'] > span:nth-of-type(2)"):
    print(item.get_text())

driver.close()

输出

vor 5 Monaten
vor 2 Jahren
vor 1 Jahr
vor 2 Jahren
vor 1 Jahr
vor 7 Monaten
vor 8 Monaten
vor 2 Monaten
vor 1 Monat
vor 1 Jahr
vor 1 Jahr
vor 3 Wochen
vor 1 Monat
vor 1 Tag
vor 4 Monaten
vor 9 Monaten
vor 8 Monaten
vor 2 Monaten
vor 5 Monaten
vor 1 Jahr
vor 1 Jahr
vor 4 Wochen

推荐阅读