python - BeautifulSoup 返回不正确的文本

标签 python beautifulsoup

我正在尝试抓取以下网站以获取现场网球比分。当比赛结束时,我正在抓取的元素发生变化,我可以获得分数,但是在比赛期间,当我搜索保留分数的相关“跨度”类时,我返回了该类,但分数为空(见下文)

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 中的匹配完成时,分数元素会发生变化。这只是现场比赛的问题...

最佳答案

该网页正在使用 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())

一旦您有了内容( 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, , , , 

使用 SeleniumPhantomJS (这样 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 解决方案的运行时间大致相同。

关于python - BeautifulSoup 返回不正确的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16386622/

相关文章:

python - 如何将实例对象保存到硬盘

python - 如何在上下文管理器中安全地处理异常

php - Simpe Loop 平方整数值在 C 中比在 PHP 中慢

python - 如何避免使用过多的 if else ?

python - 如何在 python 中循环遍历 url 列表以进行网页抓取

Python 网页抓取 - 遍历所有类别和子类别

python - 数组和向量的 numpy 逐元素乘法

python - 按标签顺序对 html 内容进行分组

python - Pandas 追加到系列中

python - BeautifulSoup(html) 不工作,说不能调用模块?