如何在 python 中使用 Selenium 和 Beautifulsoup 解析网站? [关闭]

Posted

技术标签:

【中文标题】如何在 python 中使用 Selenium 和 Beautifulsoup 解析网站? [关闭]【英文标题】:How can I parse a website using Selenium and Beautifulsoup in python? [closed] 【发布时间】:2012-12-07 06:34:30 【问题描述】:

刚接触编程,并想出了如何使用 Selenium 导航到我需要去的地方。我现在想解析数据,但不知道从哪里开始。有人可以握住我的手并指出正确的方向吗?

任何帮助表示赞赏 -

【问题讨论】:

很遗憾,这不是一个问题,您应该问一些更具体的问题。 Twitch,如果您真的是 Python 和一般编程的新手,我会尝试通过 learnpythonthehardway.org 解决您的问题——基于您下面的一些问题,我认为这会很有帮助.从那里,您将能够在此处发布更具体(和可回答)的问题。 这个问题帮助了我 【参考方案1】:

您确定要使用 Selenium 吗?为此我使用了PyQt4,它非常强大,你可以为所欲为。

我可以给你一个我刚刚写的示例代码,只需更改 url 就可以了:

#! /usr/bin/env python2.7

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import *
from bs4 import BeautifulSoup
import sys, signal

class Browser(QWebView):
    def __init__(self):
        QWebView.__init__(self)
        self.loadProgress.connect(self._progress)
        self.loadFinished.connect(self._loadFinished)
        self.frame = self.page().currentFrame()

    def _progress(self, progress):
        print str(progress) + "%"

    def _loadFinished(self):
        print "Load Finished"
        html = unicode(self.frame.toHtml()).encode('utf-8')
        soup = BeautifulSoup(html)
        print soup.prettify()
        self.close()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    br = Browser()
    url = QUrl('http://web site that can contain javascript.com')
    br.load(url)
    br.show()
    if signal.signal(signal.SIGINT, signal.SIG_DFL):
        sys.exit(app.exec_())
    app.exec_()

【讨论】:

我发现 PyQt4 使用起来非常痛苦。根据 OP 的要求,仅使用 BeautifulSoup 可能会容易得多。 你的意思是,“仅仅使用 BeautifulSoup 可能会容易得多。” OP 在这里,Beautiful soup 让我可以轻松导航到我想要解析的部分。如果可能的话,我宁愿坚持下去。 我喜欢用 pyqt4 代替 selenium——它的速度要快得多。但是当我通过 Windows 二进制安装它并尝试导入它并运行该代码时,它找不到该库。请帮忙 @Vor 我正在寻找将我的 CLI Selenium 工具移植到基于 GUI 的解决方案,Selenium 是否可以访问 PyQT 中的嵌入浏览器控件?【参考方案2】:

由于您的问题不是特别具体,这里有一个简单的示例。要做一些更有用的事情,请阅读 BS docs。您还将在 SO 中找到大量使用硒(和 BS)的示例。

from selenium import webdriver
from bs4 import BeautifulSoup

browser=webdriver.Firefox()
browser.get('http://webpage.com')

soup=BeautifulSoup(browser.page_source)

#do something useful
#prints all the links with corresponding text

for link in soup.find_all('a'):
    print link.get('href',None),link.get_text()

【讨论】:

+1,我打字的时候没看到这个:) 为此,我得到了 soup=BeautifulSoup(browser.page_source) NameError: name 'browser' is not defined 代码没问题。 browser=webdriver.Firefox() 定义 browser。直接复制代码就行了……你一定是搞错了。 @root - 知道了,但没有打印任何东西。通过 python xx.py 在 python 之外运行它 soup=BeautifulSoup(browser.page_source) 和chrome一样【参考方案3】:

假设您在要解析的页面上,Selenium 将源 HTML 存储在驱动程序的 page_source 属性中。然后将page_source 加载到BeautifulSoup 中,如下所示:

In [8]: from bs4 import BeautifulSoup

In [9]: from selenium import webdriver

In [10]: driver = webdriver.Firefox()

In [11]: driver.get('http://news.ycombinator.com')

In [12]: html = driver.page_source

In [13]: soup = BeautifulSoup(html)

In [14]: for tag in soup.find_all('title'):
   ....:     print tag.text
   ....:     
   ....:     
Hacker News

【讨论】:

@root 哈哈,愉快的假期交流。 @RocketDonkey - soup = BeautifulSoup(html) NameError: name 'html' is not defined 这是我得到的错误,任何建议 @twitchaftercoffee 所以在上面的代码中,html 指的是页面的来源。每当您到达您的页面时,您的driver 对象将有一个名为page_source 的属性,并且上面的代码将该值分配给html。请注意,这一步并不是真正必要的,因为您可以将 driver.page_source 直接传递给 BeautifulSoup(就像上面的 root 所做的那样)。 @RocketDonkey - 工作,不会抛出错误,但实际上并没有打印任何东西 @twitchaftercoffee 所以上面的例子寻找一个title标签,所以在奇怪的情况下页面没有一个然后什么都不会显示。尝试运行print soup.prettyify() - 你看到什么了吗?

以上是关于如何在 python 中使用 Selenium 和 Beautifulsoup 解析网站? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Selenium 和 Python 在控制台中跳过调试日志

如何在 python 中使用 Selenium 和 Beautifulsoup 解析网站? [关闭]

如何使用 Selenium 和 Python 在元素中查找元素?

如何使用 Selenium 和 Python 在 Python 类中调用方法

如何在 Selenium 和 Python 中使用类型查找元素

如何在 Selenium 的无头 Firefox 中使用 --screenshot 和 python