我一直在通过Python体验XPath。
问题在于并非所有表达都有效。
我刚刚找到 XPath帮助 chrome扩展程序。
正如您所看到Chrome检测到XPath,但Python没有。
网站:link
我的代码:
import __future__
from lxml import html
import requests
from bs4 import BeautifulSoup
page = requests.get('http://directory.ccnecommunity.org/reports/rptAccreditedPrograms_New.asp?sort=institution')
soup = str(BeautifulSoup(page.content, 'html.parser'))
tree = html.fromstring(soup)
smth = tree.xpath('/html/body/table[@class="center"][2]/tbody/tr[1]/td[2]/table[2]/tbody/tr/td/table/tbody/tr/td[2]/table/tbody/tr/td/text()')
print(smth)
smth
列表为空。为什么?它应该包含我在Xpath中指示的所有td
。
答案 0 :(得分:1)
不知何故,只是略有不同的问题,一次又一次地得到同样的问题变得很烦人
问题是(并且这不会改变)页面上的html完全被破坏了。所以你需要开始接受浏览器,lxml或BeautifulSoup之间的DOM解释是不同的。我建议将soup
字符串保存到文件中,试图弄清楚BeautifulSoup对破解的html做了什么。
有了这个,你可以弄清楚正确的xpath是什么(如果有的话)。
答案 1 :(得分:0)
当这些表中不存在tbody
标记时,您的xpath正在使用tbody
作为选择器的一部分。您的浏览器在呈现页面时会填充tbody
个部分,因为它们是规范的必需部分,但是如果您查看源代码,您会发现它们实际上并不存在。
不要相信浏览器看到的内容。特别是如果你启用了javascript。你经常会得到一些页面,其中元素树与简单requests.get()
将会看到的完全不同。