我正试图在以下网站上搜索现场网球比分。当比赛结束时,我正在抓取变化,我可以得到分数,但在比赛期间,当我搜索保留分数的相关“跨度”课程时,我返回课程,但分数是空白的(见下文) )
http://www.scoreboard.com/game/6LeqhPJd/#game-summary
score = score.findAll('span',attrs={'class':'scoreboard'})
输出:
[<span class="scoreboard">-</span>, <span class="scoreboard">-</span>]
预期产出
[<span class="scoreboard">1</span>, <span class="scoreboard">0</span>]
使用firebug我可以看到这些字段中的分数,但我似乎无法返回它。有人会知道为什么会这样吗??
注意:当上述URL中的匹配完成后,分数元素会发生变化。这只是LIVE比赛的一个问题......
答案 0 :(得分:6)
网页正在使用JavaScript。如果您使用urllib
下载URL,则JavaScript不会被执行。您在浏览器中看到的大部分HTML都没有生成。
执行JavaScript的一种方法是使用Selenium。 另一种方法是使用PyQt4:
import sys
from PyQt4 import QtWebKit
from PyQt4 import QtCore
from PyQt4 import QtGui
class Render(QtWebKit.QWebPage):
def __init__(self, url):
self.app = QtGui.QApplication(sys.argv)
QtWebKit.QWebPage.__init__(self)
self.loadFinished.connect(self._loadFinished)
self.mainFrame().load(QtCore.QUrl(url))
self.app.exec_()
def _loadFinished(self, result):
self.frame = self.mainFrame()
self.app.quit()
url = 'http://www.scoreboard.com/game/6LeqhPJd/#game-summary'
r = Render(url)
content = unicode(r.frame.toHtml())
一旦你有content
(在之后执行了JavaScript),你就可以用HTML解析器解析它(比如BeautifulSoup或lxml)。
例如,使用lxml:
import lxml.html as LH
def clean(text):
return text.replace(u'\xa0', u'')
doc = LH.fromstring(content)
result = []
for tr in doc.xpath('//tr[td[@class="left summary-horizontal"]]'):
row = []
for elt in tr.xpath('td'):
row.append(clean(elt.text_content()))
result.append(u', '.join(row[1:]))
print(u'\n'.join(result))
产量
Chardy J. (Fra), 2, 6, 77, , , ,
Zeballos H. (Arg), 0, 4, 63, , , ,
使用Selenium和PhantomJS(以便不会弹出GUI浏览器),这就是等效代码的样子:
import selenium.webdriver as webdriver
import contextlib
import os
import lxml.html as LH
# define path to the phantomjs binary
phantomjs = os.path.expanduser('~/bin/phantomjs')
url = 'http://www.scoreboard.com/game/6LeqhPJd/#game-summary'
with contextlib.closing(webdriver.PhantomJS(phantomjs)) as driver:
driver.get(url)
content = driver.page_source
doc = LH.fromstring(content)
result = []
for tr in doc.xpath('//tr[td[@class="left summary-horizontal"]]'):
row = []
for elt in tr.xpath('td'):
row.append(elt.text_content())
result.append(u', '.join(row[1:]))
print(u'\n'.join(result))
Selenium / PhantomJS解决方案和PyQt4解决方案的运行时间大致相同。