我正在尝试使用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以获取我想要的文本!
答案 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="correct_response">Florida State University</em><br /><br /><table width="100%"><tr><td class="wrong">Grant</td><td class="right">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"]
。