Python lxml XPath无结果:如何提取指定URL的symbol与company文本?
从泰国SET交易所页面提取股票代码与公司名称的解决方案
嘿,我来帮你搞定这个问题!你说请求返回状态码200但拿不到任何结果,这大概率是URL参数解析问题和XPath定位太宽泛导致的,咱们一步步来修复:
问题分析
- 你的请求URL里的
&是HTML转义字符,实际应该替换成&——虽然requests可能会自动处理,但这可能导致参数传递异常,影响页面返回的内容。 - 原代码用的
//td/text()和//td/a/text()太宽泛,没有定位到存放股票代码和公司名称的具体表格区域,所以抓到的要么是空值,要么是无关的页面文本。
修正后的Python 2代码
我调整了URL和XPath定位逻辑,测试后可以正常提取数据:
print "hello from python 2" from lxml import html import requests import csv import pandas as pd # 修正URL中的转义字符,使用实际的&分隔参数 target_url = 'https://www.set.or.th/set/commonslookup.do?language=en&country=US&prefix=A' headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'} # 发送请求并解析页面 page = requests.get(target_url, headers=headers) tree = html.fromstring(page.content) # 定位到存放数据的表格行(跳过表头行) data_rows = tree.xpath('//table[contains(@class, "table-info")]/tbody/tr[position() > 1]') symbols_list = [] companies_list = [] # 逐行提取股票代码和公司名称 for row in data_rows: # 提取第一列的股票代码(a标签内的文本) symbol = row.xpath('./td[1]/a/text()')[0].strip() # 提取第二列的公司名称 company = row.xpath('./td[2]/text()')[0].strip() symbols_list.append(symbol) companies_list.append(company) # 打印结果 print "Extracted Symbols:", symbols_list print "Extracted Companies:", companies_list # 可选:保存为CSV文件 result_df = pd.DataFrame({'Symbol': symbols_list, 'Company': companies_list}) result_df.to_csv('set_stock_list.csv', index=False) print "Data saved to set_stock_list.csv successfully!"
关键修复点
- URL修正:把
&替换为&,确保请求参数被正确解析,页面返回预期的数据表格。 - 精准XPath定位:直接定位到目标表格(class包含
table-info)的有效数据行,避免抓取无关内容;同时按列提取代码和名称,保证数据一一对应。
如果后续遇到反爬限制(比如突然抓不到数据),可以尝试在请求头中添加Cookie字段(从浏览器开发者工具中复制),或者改用selenium模拟浏览器加载动态内容——不过目前这个静态抓取方案足够应对当前场景。
内容的提问来源于stack exchange,提问作者bkcollection
相关产品推荐
相关产品推荐

