网页视频抓取软件 格式工厂(document_fromstring的使用方法(网页)(html字符串))

优采云 发布时间: 2022-02-28 18:04

  网页视频抓取软件 格式工厂(document_fromstring的使用方法(网页)(html字符串))

  狭义的爬虫只负责爬取,即下载网页。其实爬虫还负责从下载的网页中提取出我们想要的数据,也就是解析非结构化数据(网页)提取结构化数据(有用数据)。

  

  所以,下载网页只是第一步,重要的一步就是数据的提取。不同的爬虫想要不同的数据,提取不同的数据,但是提取的方法是相似的。

  提取数据的最简单方法是使用正则表达式。这种方法很简单,提取逻辑应该不复杂。否则写出来的正则表达式会晦涩难懂,甚至无法提取复杂的数据结构。

  最终,经过多年的经验,老猿选择了lxml和xpath来解析网页,提取结构化数据。顺便说一句,BeautifulSoup 也是解析 HTML 的好工具。它可以使用多个解析器,比如Python标准库的解析器,但是速度比较慢。你也可以使用lxml作为解析器,但是它的用法,API和lxml不一样。用了之后,lxml的API就更舒服了。

  lxml 绑定了 C 语言库 libxml2 和 libxslt,并提供了 Pythonic API。它有一些主要特点:

  一句话总结,是一款集C语言的速度与Python的简洁于一身的神器。

  lxml有两部分,分别支持XML和HTML的解析:

  lxml.etree 可用于解析 RSS 提要,这些提要是 XML 格式的文档。不过爬取的网页大部分都是html页面,所以这里主要介绍lxml.html解析网页的方法。

  

  lxml.html 从 html 字符串生成文档树结构

  我们下载的网页是一串html字符串。如何将其输入到 lxml.html 模块中生成 html 文档的树形结构?

  该模块提供了几种不同的方法:

  下面我们用具体的例子来说明上述方法的区别。

  如何使用 document_fromstring

  In [1]: import lxml.html as lh

In [2]: z = lh.document_fromstring('abcxyz')

# 可以看到,它自动加了根节点

In [3]: z

Out[3]:

In [4]: z.tag

Out[4]: 'html'

# 还加了节点

In [5]: z.getchildren()

Out[5]: []

# 把字符串的两个节点放在了里面

In [6]: z.getchildren()[0].getchildren()

Out[6]: [, ]

  使用 fragment_fromstring

  In [11]: z = lh.fragment_fromstring(‘abcxyz’)

---------------------------------------------------------------------------

ParserError Traceback (most recent call last)

in ()

----> 1 z = lh.fragment_fromstring(‘abcxyz’)

~/.virtualenvs/py3.6/lib/python3.6/site-packages/lxml/html/__init__.py in fragment_fromstring(html, create_parent, base_url, parser, **kw)

850 raise etree.ParserError(

851 “Multiple elements found (%s)”

--> 852 % ‘, ‘.join([_element_name(e) for e in elements]))

853 el = elements[0]

854 if el.tail and el.tail.strip():

ParserError: Multiple elements found (div, div)

# 可以看到,输入是两个节点(element)时就会报错

# 如果加上 create_parent 参数,就没问题了

In [12]: z = lh.fragment_fromstring('abcxyz', create_parent='p')

In [13]: z.tag

Out[13]: 'p'

In [14]: z.getchildren()

Out[14]: [, ]

  使用fragments_fromstring

  # 输入字符串含有一个节点,则返回包含这一个节点的列表

In [17]: lh.fragments_fromstring('abc')

Out[17]: []

# 输入字符串含有多个节点,则返回包含这多个节点的列表

In [18]: lh.fragments_fromstring('abcxyz')

Out[18]: [, ]

  从字符串的使用

  In [27]: z = lh.fromstring('abcxyz')

In [28]: z

Out[28]:

In [29]: z.getchildren()

Out[29]: [, ]

In [30]: type(z)

Out[30]: lxml.html.HtmlElement

  这里,如果fromstring输入是多个节点,则会添加一个父节点并返回。但是就像 html 网页从节点开始一样,我们可以使用 fromstring() 和 document_fromstring() 来获得完整的网页结构。

  从上面的代码我们可以看出,那些函数返回的是HtmlElement对象,也就是说,我们已经学会了如何从html字符串中获取HtmlElement对象。在下一节中,我们将学习如何操作 HtmlElement 对象,从中提取我们感兴趣的数据。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线