靓汤是一个开源的Python库。它使用导航解析器来抓取XML和HTML文件的内容。您需要用于多种分析目的的数据。但是,如果您对Python和web抓取还不熟悉,那么Python的漂亮的Soup库对于web抓取项目来说是值得一试的。
有了Python的开源漂亮的Soup库,您可以通过抓取网页的任何部分或元素来获取数据,并对过程进行最大程度的控制。在这篇文章中,我们来看看如何使用美丽的汤刮网站。
在继续之前,在这篇Beautiful Soup教程文章中,我们将使用python3和beautifulsoup4,这是Beautiful Soup的最新版本。确保创建一个Python虚拟环境,将项目及其包与本地计算机上的项目及其包隔离开来。
要开始,必须在虚拟环境中安装Beautiful Soup库。BeautifulSoup作为PyPi包可用于所有操作系统,因此您可以通过终端使用pip install beautifulsoup4命令安装它。
但是,如果您使用的是Debian或Linux,上面的命令仍然有效,但是您可以通过运行apt get install python3-bs4使用包管理器安装它。
靓汤不会直接刮到URL。它只适用于现成的HTML或XML文件。这意味着你不能直接把网址传给它。为了解决这个问题,您需要先通过Python的请求库获取目标网站的URL,然后再将其提供给Beautiful Soup。
要使该库可用于scraper,请通过终端运行pip install requests命令。
要使用XML解析器库,请运行pip install lxml来安装它。
在删除任何你不熟悉的网站之前,最好的做法是检查它的元素。您可以通过将浏览器切换到开发人员模式来实现这一点。如果您使用的是Google Chrome,那么使用Chrome DevTools是非常容易的。
然而,有必要检查一个网页以了解更多关于它的HTML标记、属性、类和id的信息。这样做会暴露网页的核心元素及其内容类型。
它还可以帮助你制定最佳策略,你可以用它来获得准确的数据,你想要从一个网站,以及你可以如何得到它。
现在您已经准备好了一切,打开一个首选代码编辑器并创建一个新的Python文件,给它一个选定的名称。但是,如果您不熟悉通过命令行运行Python,也可以使用基于web的ide,比如Jupyter Notebook。
接下来,导入必要的库:
from bs4 import BeautifulSoupimport requests首先,让我们看看请求库是如何工作的:
from bs4 import BeautifulSoupimport requestswebsite = requests.get('http://somewebpages.com')print(website)当您运行上面的代码时,它返回200状态,表示您的请求成功。否则,您将获得一个400状态或一些其他错误状态,指示get请求失败。
请记住始终用目标URL替换括号中的网站URL。
一旦您通过get请求获得了网站,然后将其传递给Beautiful Soup,它现在可以使用内置的XML或HTML解析器将内容读取为HTML或XML文件,具体取决于您选择的格式。
请看下面的代码片段,了解如何使用HTML解析器执行此操作:
from bs4 import BeautifulSoupimport requestswebsite = requests.get('http://somewebpages.com')soup = BeautifulSoup(website.content, 'html.parser')print(soup)上面的代码返回网页的整个DOM及其内容。
您还可以通过使用prettify方法获得一个更加一致的DOM版本。您可以尝试查看其输出:
from bs4 import BeautifulSoupimport requestswebsite = requests.get('http://somewebpages.com/')soup = BeautifulSoup(website.content, 'html.parser')print(soup.prettify())您还可以获取网页的纯内容,而无需使用.text方法加载其元素:
from bs4 import BeautifulSoupimport requestswebsite = requests.get('http://somewebpages.com/')soup = BeautifulSoup(website.content, 'html.parser')print(soup.text)你也可以用漂亮的汤刮去特定标签中的内容。为此,需要在请求中包含目标标记的名称。
例如,让我们看看如何获取网页的h2标记中的内容。
from bs4 import BeautifulSoupimport requestswebsite = requests.get('http://somewebpages.com/')soup = BeautifulSoup(website.content, 'html.parser')print(soup.h2)在上面的代码片段中,soup.h2返回网页的第一个h2元素,并忽略其余元素。要加载所有h2元素,可以使用find\u all内置函数和Python的for循环:
from bs4 import BeautifulSoupimport requestswebsite = requests.get('http://somewebpages.com/')soup = BeautifulSoup(website.content, 'html.parser')h2tags = soup.find_all('h2')for soups in h2tags: print(soups)该代码块返回所有h2元素及其内容。但是,您可以使用.string方法获取内容,而无需加载标记:
from bs4 import BeautifulSoupimport requestswebsite = requests.get('http://somewebpages.com/')soup = BeautifulSoup(website.content, 'html.parser')h2tags = soup.find_all('h2')for soups in h2tags: print(soups.string)您可以对任何HTML标记使用此方法。你所需要做的就是用你喜欢的标签替换h2标签。
但是,您也可以通过将标记列表传递到find\u all方法中来获取更多标记。例如,下面的代码块将删除a、h2和title标记的内容:
from bs4 import BeautifulSoupimport requestswebsite = requests.get('http://somewebpages.com/')soup = BeautifulSoup(website.content, 'html.parser')tags = soup.find_all(['a', 'h2', 'title'])for soups in tags: print(soups.string)在使用DevTools检查一个网站之后,它可以让您更多地了解DOM中包含每个元素的id和class属性。一旦你有了那条信息,你就可以用这个方法来刮取网页了。当目标组件的内容从数据库循环出来时,它很有用。
您可以对id和类scraper使用find方法。与返回iterable对象的find\u all方法不同,find方法工作于一个不可iterable的目标,即本例中的id。所以,不需要使用for循环。
让我们看一个如何使用id刮取以下页面内容的示例:
from bs4 import BeautifulSoupimport requestswebsite = requests.get('http://somewebpages.com/')soup = BeautifulSoup(website.content, 'html.parser')id = soup.find(id = 'enter the target id here')print(id.text)要对类名执行此操作,请将id替换为class。然而,编写类直接导致语法混乱,因为Python将其视为关键字。要绕过该错误,需要在类前面写一个下划线,如下所示:class\。
本质上,包含id的行变成:
my_classes = soup.find(class_ = 'enter the target class name here')print(my_classes.text)但是,您也可以通过调用具有相应id或类的特定标记名来刮取网页:
data = soup.find_all('div', class_ = 'enter the target class name here')print(data)您可以创建一个类,并将前面的所有代码放在该类中的一个函数中,以生成一个可重用的scraper,该scraper获取一些标记及其id的内容。我们可以通过创建一个接受五个参数的函数来实现这一点:一个URL、两个标记名及其对应的id或类。
假设你想从电子商务网站上搜刮衬衫的价格。下面的示例scraper类提取price和shirt标记及其相应的id或类,然后将其作为Pandas数据帧返回,其中“price”和shirt\u name作为列名。
如果您还没有通过终端pip安装pandas,请确保您已经通过终端pip安装了pandas。
import pandas as pdclass scrapeit:try:def scrape(website=None, tag1=None, id1=None, tag2=None, id2=None):if not (website and tag1 and id1 and tag2 and id2)==None: try:page = requests.get(website)soup = BeautifulSoup(page.content, 'html.parser')infotag1 = soup.find_all(tag1, id1)infotag2 = soup.find_all(tag2, id2) priced = [prices.text for prices in infotag1]shirt = [shirts.text for shirts in infotag2]data = {'Price':priced, 'Shirt_name':shirt}info = pd.DataFrame(data, columns=['Price', 'Shirt_name'])print(info)except:print('Not successful')else:print('Oops! Please enter a website, two tags and thier corresponding ids')except:print('Not successful!')您刚刚创建的scraper是一个可重用的模块,您可以在另一个Python文件中导入并使用它。要从其类调用scrape函数,可以使用刮。刮('Website URL'、'price\u tag'、'price\u id'、'shirt\u tag'、'shirt\u id')。如果不提供URL和其他参数,else语句将提示您这样做。
要在另一个Python文件中使用scaper,可以像这样导入它:
from scraper_module import scrapeitscrapeit.scrape('URL', 'price_tag', 'price_id', 'shirt_tag', 'shirt_id')注意:scraper\u module是包含scraper类的Python文件的名称。
如果你想更深入地了解如何最好地利用它,你也可以查看漂亮的汤文档。
BeautifulSoup是一个强大的Python屏幕刮刀,它可以让您控制在刮刀过程中数据的传输方式。它是一个很有价值的商业工具,因为它可以让你访问竞争对手的网络数据,如定价、市场趋势等。
尽管我们在本文中**了一个标记刮刀,但是您仍然可以使用这个强大的Python库来**更有用的刮刀工具。
关键区别–Python2与3 Python是一种高级编程语言。它是一个面向对象和面向过程的多范式。蟒蛇是圭多·范罗森发现的。它是一种易于学习的编程语言,可用于各种应用程序。Python有两个主要版本,分别是python2和python3。本文将...
...ava程序员可以使用开源LibGDX框架从头开始快速创建游戏。这个框架可以导出到任何支持Java的桌面平台,再加上Android和iOS。这是一个简单明了的框架,有利于快速开发。强烈推荐。 Haxe:Haxe是一种可以移植到许多其...
...入研究了Java编程。尽管如此,它仍然是初学者友好的。这个refcard涵盖了从设置到Java编程以及测试I/O库的所有内容。因此,带有Java和Raspberry Pi refcard的DZone IoT应用程序提供了全面的软件和硬件概述。DZone的IoT部分提供了一个新的...
...成熟的web IDE,允许您在web上创建和托管Python应用程序。这个“TryiPython”页面只是一个漂亮的小工具。 ...
...个你想要的网站,如果你喜欢质量而不是数量的话——在这个例子中,这意味着每个月都会有一个新的教程,但是每个教程都是独一无二的,功能齐全的。你会从每个人身上学到很多。 ...
... 在本教程中,您可以同时使用python2.7或python3.4+。这个例子是针对python3的。对于Python2.7,在本教程中用Python替换Python3,用pip替换pip3。 ...
... 注意这里的间距,因为它是必不可少的得到正确的!这个命令下载一个属于Gnu隐私保护(GPG)的密钥,并将其添加到您的系统中。这不会安装OSS代码,它只是确保程序下载时,它会正确安装。 ...
...库包括绘图、文本输入、声音,甚至一些基本的网络。在这个平台上为孩子们检查一些简单的编码项目,看看它是否适合你! ...
...再上学了,也不意味着你应该停止学习。恰恰相反:今天这个永远联系在一起的世界让你比以往任何时候都更容易了解任何你能想象到的话题。 ...