You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python lxml XPath无结果:如何提取指定URL的symbol与company文本?

从泰国SET交易所页面提取股票代码与公司名称的解决方案

嘿,我来帮你搞定这个问题!你说请求返回状态码200但拿不到任何结果,这大概率是URL参数解析问题和XPath定位太宽泛导致的,咱们一步步来修复:

问题分析

  1. 你的请求URL里的&是HTML转义字符,实际应该替换成&——虽然requests可能会自动处理,但这可能导致参数传递异常,影响页面返回的内容。
  2. 原代码用的//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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:27:53