4、网页解析工具

网页解析(提取数据)工具:BeautifulSoup是一个库(使用前还要先生成BeautifulSoup对象),XPath是一个语言
一、BeautifulSoup
from bs4 import BeautifulSoup
打开html文件,然后可以在终端进行import的导包,以及各种方法操作
BeautifulSoup 是一个可以从‘ HTML ’或’ XML ’ 文件中提取数据的Python库,它的使用方式相对于正则来说更加的简单方便
使用BeautifulSoup解析一段网页代码,能够得到一个 BeautifulSoup 的对象,并能按照标准的缩进格式的结构输出
BeautifulSoup有提取功能,但本身没解析功能,所以还要下载解析器,下载后使用,通常面对的是HTML文件,所以用lxml HTML 解析器
soup = BeautifulSoup(html_doc, ‘lxml’)其中lxml为解析器的指定,如果不指定也会被默认是lxml的
节点对象:soup.a【’属性‘】获取a中该属性的值
1、Tag:BeautifulSoup中最为重要的对象,标签的意思,tag还有许多的方法和属性
每个Tag对应的name属性是所指标签的名字,其中的Attributes是标签名中的出来名称的其他属性,get_text()方法能提取tag下的所有文本内容
2、NavigableString:可以遍历的字符串,由soup.a.text其中text选取a标签的类型只是字符串,text换成srting才是可遍历的字符串
3、BeautifulSoup:解析网页获得的对象(可设立对象名来装载)
4、Comment:在网页中的注释以及特殊字符串,from bs4.Comment import BeautifulSoup
soup = BeautifulSoup(html_doc, ‘lxml’),soup为BeautifulSoup对象,从头开始到尾包含在内,soup.标签,这种方法一般是提取文本中的第一个该标签、
亲戚标签方法:
children是获取某个节点的所有子节点(注释不算子节点,也会被取入),但是返回的是一个迭代器,可以转换成列表list(标签 . children)
如果children取某个节点(有多个兄弟标签只获取第一个)的子节点有多个div兄弟标签,
只会取第一个标签,而且标签中有a标签,则不会单独(不会把内容当作子节点一样呈现)取出来
contents可以获取某个节点所有的子节点,包括里面的NavigableString对象,且获取的子节点是列表格式
children转成list才会去从for循环一个个的取出内容,所以除了内存差别,和contents其他基本一样
contents和children获取的是某个(有多个兄弟标签只获取第一个)节点的直接子节点,而无法获得子孙节点。就像标签中有a标签,则不会单独取出来。
通过descendants可以获得所有子孙节点,返回的结果跟children一样,需要迭代或者转类型使用。
方法:next_sibling(提取下一个兄弟标签) 和 previous_sibling(提取上一个兄弟标签)
next_siblings (提取往下所有兄弟标签)和 previous_siblings(提取往上所有兄弟标签)
’\n‘回车符也算是一个后代元素,一般都需要进行过滤,否则用next_sibling会只取到一个回车符\n

parent:取父标签
parents:取当前节点递归到顶层的所有父辈元素
以上基本都是得到一个迭代生成器
stripped_strings可以将全是空白的行去掉

find_all():可大量查找元素的方法
find_all(‘b’)可以直接查找出整个文档树中所有的b标签
def find_all(name=None,attrs={},recursive=True(默认开启递归),text=None)
得到的结果存储在列表中,name指定标签名字获得所有对应元素,attrs指定属性获得所有对应元素,recursive递归是否开启,text指定标签内容来获取所有对应元素
attrs需要通一个字典参数来搜索属性,find_all也可以将re.compile编译的对象传入find_all()方法,即可通过正则来进行搜索,soup.find_all(re.compile("^b"))

css选择器:
BeautifulSoup支持使用CSS选择器来进行搜索。使用select(),在其中传入字符串参数,就可以使用CSS选择器的语法来找到tag
soup.select(‘p’)查找所有的p标签,soup.select(‘p>t‘)查找’所有‘p标签中的’所有‘t标签

二、XPath
XPath 是一门在 ‘ XML ’ 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历,相比于BeautifulSoup,Xpath在提取数据时会更有效率
在python中很多库都提供XPath的功能,但是最流行的还是lxml这个库
XPath 使用路径表达式在 XML/HTML 文档中选取节点。节点是通过沿着路径或者 step 来选取的
常用的路径表达式:(放在路径前面)
nodename:选取当前节点的所有nodename子节点,即把标签名字写上去就行不用加其他符号,比如p=html.xpath(’a‘)
/:从根节点选取
//:从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置,即所有该元素。(全局选择)
//p//a/b,这里的a是在当前路径选取好的所有p中进行全局选取查找a标签中的b标签
. :选取当前节点,比如python中from .items import ~~~~,相当于从当前节点中导入items库
… :选取当前节点的父节点(往上一级)
@:选取属性(可输入属性=’属性值‘)如果是//a【@属性】就是找标签,//a/@id就是只找a中的属性对应的值,//a/@id=‘····’就是找符合该条件的个数是多少
./div相当于在当前路径下找div而不是全局,所以找不到内容的时候可以改成//div,
虽然./有和没有/表示都一样,但这里的./不能去掉/,他不是一个文件,而是一个节点,./div表示当前元素下的div标签,./表示当前元素标签

html=etree.HTML(resp.text)得到一个迭代器
p=html.xpath(’//a‘)仍然是迭代器
d=p.xpath(’//b‘)仍然是迭代器
d=p.xpath(’//b/text()‘)一定要用text()或string()来提取内容
获取节点下的文本:
text():会获取某个节点中的文本,但是节点的子节点的文本不获取
string():某节点和某节点的子节点的文本都会获取,和text的用法不一样的是,d=p.xpath(’string(//b)‘)要在括号里输入路径表达式

text取某个内容好,string取多个内容好,不用整合

谓语:(相当于BeautifulSoup中tag的Attributes属性)(放在路径后面)
谓语被嵌在方括号中描述节点,用来查找某个或某些特定的节点或者包含某个指定值的节点
//bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
//bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
//bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
//bookstore/book[position() < 3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//bookstore/book[position() <last()-1] 选取最前面至倒数第二个元素的前面所有元素,(比如有5个元素,相当于先取4,然后position()<4)
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang=‘eng’] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
//bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
比如~~~就是说book标签下的price的值(即value)为60,属于大于35
//bookstore/book[price>35.00]/title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。
比如,title与price同级

选取未知的节点时,XPath通配符可用来选取未知节点(放在路径后面)

  • 匹配任何元素节点 //bookstore/* 选取bookstore元素的所有子元素。
    @* 匹配任何属性节点(和没区别(要加中括号)//title[@] 选取所有带有属性的title元素
    node() 匹配任何类型的节点 //* 选取文档中的所有元素

选取多个路径,通过在路径表达式中使用"|"运算符,您可以选取若干个路径(放在路径与路径中间)
//book/title | //book/price 选取book元素的所有title和price元素
//title | //price 选取文档中所有的title和price元素
//bookstore/book/title | //price 选取bookstore元素的book元素的所有title元素,以及文档中所有的price元素

索引选元素:
d=p.xpath(’/a【1】根据列表来选择,从0开始,得到的是列表中的一个元素
d=p.xpath(’/a【2】‘)根据Xpath规则,从1开始(2改成0不会得到数据),得到的是一个列表

from lxml import etree:
page=etree.HTML(html_str(response对象的文本内容))对html格式化后就可以用Xpath进行解析了,因为Xpath是针对xml使用的
strip()可以将空白格的行去掉

注:::迭代器要用for循环取出其中的子元素才好提取文本

注、:文件打开with open一般不放for循环后面,因为不停多次打开占内存

请求得到响应》》》XPath解析得到迭代器》》》for循环分解再xpath得到具体元素

scrapy框架用xpath解析不了js文件的数据script标签里的内容

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
作为一个网页制作高手、美工和程序员,我们都有过这样的经历:当看到一个漂亮的Flash的 时候或看到一个精巧的JavaScript功能的时候,使用IE的查看源代码的功能,仔细分析相关 的HTML代码,从临时目录中或网站上取得想要的SWF文件和JS文件。吸取别人优点的做法往 往能够事半功倍,互联网中这样的宝藏真是不计其数!WebPage Spy就是一个帮助我们挖掘这 些宝藏的工具,他能够将您想要从网页中得到的一切分门别类的呈现在您眼前! WebPage Spy有一个HTML代码分析器,它能够在网页在浏览器显示一个网页的时候自动从其中 分析出该网页所含的HTML文件、Flash文件、JavaScript代码、Style Sheet代码、图像文件、 Applet文件、链接等等。所有这些显示在树形列表中,点击鼠标就可以查看图像和浏览代码, 可以将自己喜欢的文件保存到自己指定的目录中。 WebPage Spy还提供了许多附件来增强IE的功能,这些功能添加在同内容相关的右键菜单中, 您可以根据自己的需要选用:您可以使用“搜索包含此内容的网站“和“在新闻组中搜索此内容” 功能在互联网上搜索在网页中选中的文字;您可以使用“查看所选部分的代码”来查看网页的 部分HTML代码,方便程序调试和代码分析;“放大“、“缩小”和“高亮度显示文字”功能方便您在 演示的时候更好的标示重点,等等。 WebPage Spy还将常用的IE配置功能通过菜单的方式提供,您只要点击一下就可以达到目的, 再也不用总是进入“工具/Internet选项”,在选项卡中来回翻找。提供的快捷功能有:删除临 时文件,删除cookies,清除历史纪录。提供的选项开关有:显示图片,禁止脚本调试,启用 自动完成功能,允许脚本运行,允许Java Applet运行,允许ActiveX和插件运行。 赶快拥有WebPage Spy,发掘网页中无尽的宝藏! 产品特性 * 在您浏览网页的同时自动运行; * 同IE完美集成,可以象收藏夹那样显示和关闭; * 支持含Frame和IFrame的网页; * 将Flash, 图像, JavaScript, Style Sheet, 链接分类显示在树中; * 能够生成网页的所含外部元素的报告,并估算整个网页完全下载所需的时间; * 双击鼠标查看JavaScript, Style Sheet和网页的源代码; * 保存任何喜欢的内容; * 提供很多增强IE功能的附件; * 自定义增加的附件的数量; * 提供改变IE设置的快捷操作; * 图像列表可以将页面背景图,表格背景图等都列举出来; * JavaScript和Style Sheet列表包含链接的外部文件,也包含网页中内含的代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

T o r

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值