如何用requests_session提取网页HTML表格?Python新手求助
解决思路与代码示例
1. 先搞清楚核心差异
requests-html返回的是Element对象,和Selenium的WebElement不是一回事,自然没有get_attribute()方法。要提取表格内容,直接拿元素的HTML或者文本就行。
2. 用requests-html快速转DataFrame
方法一:直接丢给pandas解析
如果表格结构规整,这招最快:
from requests_html import HTMLSession import pandas as pd # 初始化会话 session = HTMLSession() # 替换成你的零件页面URL target_url = "https://example.com/part-info" resp = session.get(target_url) # 用XPATH定位表格,这里假设取第一个表格,可根据实际调整XPATH target_table = resp.html.xpath('//table')[0] # 提取表格的HTML代码 table_html = target_table.html # pandas自带的read_html能直接解析HTML表格 df = pd.read_html(table_html)[0] print(df.head())
方法二:手动遍历提取(适合复杂表格)
如果表格有合并单元格或者结构混乱,手动遍历更稳妥:
from requests_html import HTMLSession import pandas as pd session = HTMLSession() target_url = "https://example.com/part-info" resp = session.get(target_url) table = resp.html.xpath('//table')[0] # 提取表头 headers = [th.text.strip() for th in table.xpath('.//th')] # 提取每一行数据 row_list = [] # 跳过表头行,从第二行开始遍历 for tr in table.xpath('.//tr')[1:]: row_data = [td.text.strip() for td in tr.xpath('.//td')] row_list.append(row_data) # 构造DataFrame df = pd.DataFrame(row_list, columns=headers) print(df)
3. 补上BeautifulSoup的正确用法
要是之前用BeautifulSoup没搞定,试试结合requests.session的写法:
import requests from bs4 import BeautifulSoup import pandas as pd session = requests.Session() target_url = "https://example.com/part-info" resp = session.get(target_url) soup = BeautifulSoup(resp.text, 'html.parser') # 定位表格,也可以用soup.select('table#指定id')更精准 table = soup.find('table') # 提取表头 headers = [th.get_text(strip=True) for th in table.find_all('th')] # 提取行数据 row_list = [] for tr in table.find_all('tr')[1:]: row_data = [td.get_text(strip=True) for td in tr.find_all('td')] row_list.append(row_data) df = pd.DataFrame(row_list, columns=headers) print(df)
4. 批量处理的小技巧
- 一定要复用会话对象(不管是
HTMLSession还是requests.Session),别每次请求都新建,能省不少连接时间 - 批量处理时可以加个小延时(比如
time.sleep(1)),别猛刷网站容易被封 - 要是想更快,试试多线程(比如用
concurrent.futures.ThreadPoolExecutor),但注意控制并发数
内容的提问来源于stack exchange,提问作者Stacy Malik
相关产品推荐
相关产品推荐

