spider数据挖掘-----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标签里的内容

猜你喜欢

转载自blog.csdn.net/qwe863226687/article/details/114116914
今日推荐