XPath提取href包裹文本求助:从维基MLS页面提取教练姓名
解决XPath提取href包裹文本的问题
你的问题核心是XPath路径匹配错误,导致拿不到目标文本。直接给你修正方案和原因说明:
问题根源
- 维基百科这个目标表格的原始HTML里没有
<tbody>标签,你写的//tbody会让整个路径匹配失败(tbody是浏览器渲染时自动补的,lxml解析原始HTML时不会生成这个标签) - 目标文本"Gonzalo Pineda"是嵌套在
<a>标签里的,直接取td[2]/text()只能拿到td里的空白换行,拿不到a标签内的有效文本
修正后的代码方案
方案1:精准定位a标签取文本
这个方法直接匹配目标文本所在的a标签:
import requests from lxml import html t = requests.get("https://en.wikipedia.org/wiki/2022_Major_League_Soccer_season") dom_tree = html.fromstring(t.content) # 去掉tbody,直接定位第二个wikitable下的tr,再取td[2]内a标签的文本 coach = dom_tree.xpath('//table[contains(@class, "wikitable")][2]//tr/td[2]/a/text()') # 取第一个结果(Gonzalo Pineda是该列第一个条目) print(coach[0]) # 输出 Gonzalo Pineda
方案2:提取td下的所有文本(更鲁棒)
如果担心a标签结构变化,用normalize-space()提取td下的所有文本并自动去除空白:
import requests from lxml import html t = requests.get("https://en.wikipedia.org/wiki/2022_Major_League_Soccer_season") dom_tree = html.fromstring(t.content) # 直接提取目标td的所有文本,自动处理换行和空格 coach = dom_tree.xpath('normalize-space(//table[contains(@class, "wikitable")][2]//tr[2]/td[2])') print(coach) # 输出 Gonzalo Pineda
补充说明
你之前加a[contains(@href, "wiki")]返回空列表,也是因为路径里多了tbody,导致整个XPath找不到任何匹配元素,去掉tbody就能正常匹配。
内容的提问来源于stack exchange,提问作者reksapj
相关产品推荐
相关产品推荐

