我正在尝试创建一个 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/