来自子元素的文本XPath

时间:2017-03-29 06:39:40

标签: python xml xpath

我正在尝试使用XPath从网页中选择文本。在检查元素时,我看到this。我想要Florida State University。当我右键单击以复制XPath时,我得到了这个:

//*[@id="clue_J_3_2"]/em

但是,当我运行python代码时:

from lxml import html
import requests
game_url = 'http://www.j-archive.com/showgame.php?game_id=5566'
page = requests.get(game_url)
tree = html.fromstring(page.content) 
path = '//*[@id="clue_J_3_2"]/em'
print tree.xpath(path)

我得到的输出是[]。我尝试了很多变化,包括:

  • //*[@id="clue_J_3_2"]/em/text()

  • /*/[@id="clue_J_3_2"]/em

  • //*[@id="clue_J_3_2"]//em[@class="correct_response"]/text()

请让我知道如何修复我的XPath以获取我想要的文本!

2 个答案:

答案 0 :(得分:0)

您的xpath是正确的,但您需要单击该元素才能在DOM中获得所需的xpath。当我查看有问题的页面时,我得到了这个。

<div onmouseover="toggle('clue_J_3_2', 'clue_J_3_2_stuck', '(Grant: What is Florida?)<br /><br /><em class=&quot;correct_response&quot;>Florida State University</em><br /><br /><table width=&quot;100%&quot;><tr><td class=&quot;wrong&quot;>Grant</td><td class=&quot;right&quot;>Holly</td></tr></table>')" onmouseout="toggle('clue_J_3_2', 'clue_J_3_2_stuck', 'In 1858 this university went co-ed when it took on the Tallahassee Female Academy')" onclick="togglestick('clue_J_3_2_stuck')">

因此,您似乎必须自己解析div onmouseover。或者也许使用硒,但我不会那么远。

toggle_js = tree.xpath('//div[@onclick="togglestick(\'clue_J_3_2_stuck\')"]/@onmouseover')[0]
# 'toggle(\'clue_J_3_2\', \'clue_J_3_2_stuck\', \'(Grant: What is Florida?)<br /><br /><em class="correct_response">Florida State University</em><br /><br /><table width="100%"><tr><td class="wrong">Grant</td><td class="right">Holly</td></tr></table>\')'
answer = re.findall(r'correct_response">(.*)</em>', str(toggle_js))
answer[0].strip() if answer else None
# 'Florida State University'

答案 1 :(得分:0)

我已检查过此页面的源代码,我发现某些元素是由javascript动态创建的,因为request只能获取HTML代码,因此这就是使用{{1}时得到空结果的原因}。
在我改变路径tree.xpath(path)之后,我得到了一些文字 请记住,如果您想使用print,您应该这样做:'//*[@id="clue_J_3_2"]