python - 如何找到 HTML 元素所需的 XPath?

标签 python html xpath

我正在尝试创建一个 Python 应用程序,该应用程序使用 lxml 从网站上抓取 HTML 并收集国家及其相应的首都。我正在从以下位置抓取 HTML:http://www.manythings.org/vocabulary/lists/2/words.php?f=countries_and_capitals我不知道如何获取所有国家/地区,以便将它们放入列表中。这是我到目前为止所拥有的:

from lxml import html
import requests

page = requests.get("http://www.manythings.org/vocabulary/lists/2/words.php?f=countries_and_capitals")
tree = html.fromstring(page.content)

countries = tree.xpath('//*[@id="yui-main"]/div/div[2]/div/div[1]/ul/li[1]/b')
capitals = tree.xpath('//*[@id="yui-main"]/div/div[2]/div/div[1]/ul/li[1]/i')

print 'Countries: ', countries
print 'Capitals: ', capitals

现在输出是两个空列表,我相当确定这是因为 XPath 不正确,但我对 XPath 和 HTML 都不够熟悉,无法纠正它。我宁愿被引导去寻找答案,也不愿去提供答案。

最佳答案

这是一个有趣的问题。事实证明您的 X-Path 和 HTML 是正确的 - 使用 Chrome 调试工具运行它们选择了适当的元素。然而,当通过 python 交互式 shell 进行调试时,问题就变得明显了 - yui-main div 实际上并不存在。

网页使用 JavaScript 动态更新 - 内容在运行时加载到 yui-main div 中。 xml 解析器不会执行 JavaScript,因此你的解析树永远不会有 yui-main div。

我通过简单地关闭浏览器中的 JavaScript 并访问该页面来确认这一点。

之后想出一个 XPath 选择器是很简单的:

countries = tree.xpath('//li/b/text()')
capitals = tree.xpath('//li/i/text()')

关于python - 如何找到 HTML 元素所需的 XPath?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33904982/

相关文章:

javascript - Javascript/Html 中自动完成 41.000 个条目的弹出窗口?

javascript - JS : prevent text input field from gaining focus unless clicked

java - 如何修复 Eclipse 上 HTML 文件中的错误?

ruby - 如何使用 XPath 选择祖先的特定 sibling

xml - 使用XSLT选择另一个节点中不存在的所有元素

python - 如何在python中转义 “\”字符

Python selenium 单击按钮链接

html - 使用 xpath 选择内部带有图像的链接的 href

python - python 中的元组列表

python - 鸡蛋和零件之间的构建有什么区别?