我使用lxml和python解析网站。 问题是当我通过Mozilla FireFox中的Firebug扩展检查它时,我能够看到该元素。但它显示我正在阅读的页面源中没有存在 代码是
import urllib
from lxml import etree
page=urllib.urlopen(url)
response=page.read()
x=etree.HTML(response)
company=x.xpath('//div[@class="name"]')
所有带有class =“name”的div标签都可以在通过Mozilla Firebug扩展检查中清楚地看到。但HTML页面源代码中没有存在
提前致谢
答案 0 :(得分:1)
div
的 class="name"
元素通过一组XHR调用加载。请使用AngelList API
。
此外,根据Terms of Use
,网络抓取是非法的:
根据本协议允许抓取服务, 但在未经AngelList事先同意的情况下抓取服务除外 明确禁止本协议允许的
答案 1 :(得分:0)
页面源指定页面的初始结构,但此Document Object Model (DOM)可以完全由页面上执行的JavaScript脚本更改。这很可能是正在发生的事情,使页面源代码看起来与实际运行页面不同。
因此,您需要能够执行所需JavaScript功能的东西,并且还可以检查修改后的DOM。如果您正在使用Python,一个选项是使用PySide为Qt提供Python绑定(也许您也可以使用PyQt,但我不熟悉它)并且Qt本身也有支持对于基于WebKit的浏览器引擎。
以下Python 2代码受Qt示例webkit-domtraversal的启发,并在加载页面后立即打印DOM。我怀疑这仍然不足以达到您的目的,因此您可能需要添加一点额外的延迟才能让页面中的所有JavaScript都能正常工作。目前,只有HTML标记名称被写入屏幕,但使用QWebElement的文档,应该很容易修改它。
#!/usr/bin/env python
from PySide import QtGui, QtCore, QtWebKit
import sys
class MyWin(QtGui.QMainWindow):
def __init__(self, url):
super(MyWin, self).__init__()
self.page = QtWebKit.QWebPage(self)
self.view = QtWebKit.QWebView(self)
self.view.setPage(self.page)
self.setCentralWidget(self.view)
self.page.mainFrame().loadFinished.connect(self.loadFinished)
self.page.mainFrame().load(QtCore.QUrl(url))
def loadFinished(self, ok):
print "Load finished", ok
doc = self.page.mainFrame().documentElement()
self.examineChildElements(doc)
def examineChildElements(self, parent, indent = 0):
self.printElement(parent, indent)
elem = parent.firstChild()
while not elem.isNull():
self.examineChildElements(elem, indent + 2)
elem = elem.nextSibling()
def printElement(self, elem, indent):
print " "*indent + elem.tagName()
def main():
print "Enter URL:"
url = raw_input()
a = QtGui.QApplication(sys.argv)
w = MyWin(url);
w.show()
a.exec_()
if __name__ == "__main__":
main()