如何在 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 类中调用方法