嘿,未来的自动化大师们!今天我们来学习如何通过 Selenium 提取网页中元素的文本和属性。这是一个非常强大的工具,因为在网页爬取的世界里,最重要的就是能获取数据。准备好从互联网的深渊中挖掘有用数据了吗?那么,开始吧!
1. 本讲座的主题是什么?
- 数据提取基础:如何从 HTML 元素中提取文本,光听起来就像完成了一次壮举。
- 获取属性:比如链接
(href)
和图片(src)
这样的宝藏,学会之后你可以做一些神奇的事情。 - 实际案例:我们将练习从网页中的表格和列表中提取数据。正如伟大的程序员曾经说过:"只有亲自操作代码,才能真正理解它。"
2. 从元素中提取文本
假设你有一个漂亮的网站,上面满是有用的信息。你需要从标题、段落和其他 HTML 元素中提取文本。怎么办呢?这时候 Selenium 就派上用场了。
示例
Python
from selenium import webdriver
# 配置 Chrome 驱动
driver = webdriver.Chrome()
# 打开网站
driver.get("https://example.com")
# 按类名查找元素并提取文本
element = driver.find_element_by_class_name("example-class")
text = element.text
print("提取的文本:", text)
# 别忘了关闭浏览器
driver.quit()
这里我们使用 .text
方法获取元素的文本内容。这比学习 Python 中所有异常都简单多了,是不是?
3. 从元素中提取属性
文本是很棒,但如果你需要提取更具体的东西,比如链接的 URL 或图片的路径,该怎么办呢?Selenium 也可以帮到你。
示例
Python
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://example.com")
# 使用 CSS 选择器查找元素并提取 'href' 属性
link_element = driver.find_element_by_css_selector("a.link-class")
link_href = link_element.get_attribute("href")
print("链接的 URL:", link_href)
# 按 ID 查找元素并提取 'src' 属性
img_element = driver.find_element_by_id("logo")
img_src = img_element.get_attribute("src")
print("图片的 URL:", img_src)
driver.quit()
如你所见,一切都和之前一样,只是我们用 .get_attribute("属性名")
替换了 .text
。这些方法既简单又强大。
4. 在实践中应用这些方法
理论到此为止,因为程序员一般都不喜欢长时间停留在抽象层面上。现在我们来看一个例子,从网站的表格中提取数据。
从表格中提取数据
假如你需要从网站的表格中提取所有行并打印到控制台。可以这么实现:
Python
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://example.com")
# 按 ID 查找表格
table = driver.find_element_by_id("example-table")
# 查找表格中的所有行
rows = table.find_elements_by_tag_name("tr")
for row in rows:
# 查找当前行中的所有单元格
cells = row.find_elements_by_tag_name("td")
for cell in cells:
print(cell.text, end=' ')
print()
driver.quit()
首先我们找到表格,然后遍历它的所有行和单元格,提取并打印它们的文本。这就像解开一个复杂的蜘蛛网,最终一切都变得简单明了!
5. 常见错误以及如何避免
在你进入提取数据的代码冒险之前,我们来谈谈可能会遇到的常见错误。
当你处理动态页面时,时间可能会成为你的敌人。如果你试图提取一个还未加载的元素的文本或属性,就会收到 NoSuchElementException
错误。这就像尝试在惊喜到来之前抓住它。为了避免这种情况,使用显式等待 (WebDriverWait
),而不是依赖运气。
Python
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://example.com")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, "lazy-class"))
)
print(element.text)
finally:
driver.quit()
在这里,我们使用了 WebDriverWait
和 expected_conditions
来等待元素加载。这就像等一道菜完全准备好,然后才能享受它的美味。
GO TO FULL VERSION