如何在Python中获取无value属性的textarea元素值
问题分析与解决方案
问题根源
你遇到的是动态内容渲染问题:页面中textarea#BTCaddrC的内容是通过JavaScript在浏览器加载页面后动态生成的,服务器返回的原始HTML源码里并没有这个值。urllib+lxml只能抓取原始HTML,无法执行JavaScript,自然拿不到渲染后的内容。
解决方案
方案1:使用Selenium模拟浏览器(推荐,直接获取渲染后DOM)
Selenium会模拟真实浏览器的行为,等待JavaScript执行完成后再获取DOM内容,能直接拿到textarea的value值。示例代码如下:
#coding: utf8 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 nb = 36893488147419103232 url_base = f"https://bitcoin.oni.su/{nb}" # 初始化Chrome浏览器(需提前安装对应版本的chromedriver) driver = webdriver.Chrome() try: driver.get(url_base) # 等待目标textarea元素加载完成,最长等待10秒 textarea = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "BTCaddrC")) ) # 获取textarea的value属性值 btc_address = textarea.get_attribute("value") print(btc_address) finally: # 关闭浏览器 driver.quit()
方案2:直接抓取数据接口(更高效)
打开浏览器开发者工具的「Network」标签,刷新页面后,筛选「XHR/Fetch」类型的请求,找到返回比特币地址数据的接口。找到接口后,直接用requests库调用该接口获取数据,无需加载整个页面。
比如假设找到的接口是https://bitcoin.oni.su/api/address?num={nb},代码示例:
#coding: utf8 import requests nb = 36893488147419103232 api_url = f"https://bitcoin.oni.su/api/address?num={nb}" headers = {'User-Agent': 'Mozilla/5.0'} response = requests.get(api_url, headers=headers) # 根据接口返回的格式解析数据,比如JSON格式 btc_address = response.json().get("address") print(btc_address)
为什么原代码无法生效?
lxml解析的是服务器直接返回的原始HTML文本,而浏览器开发者工具中看到的DOM是经过JavaScript渲染后的结果,两者内容不一致。原始HTML里的textarea没有value属性,所以你尝试的get_btc_adr[0].value、text等方法都无法拿到数据。
内容的提问来源于stack exchange,提问作者Garbez François
相关产品推荐
相关产品推荐

