Python爬虫学习笔记4:解析库的使用
学习参考:Python3网络爬虫开发实战
lxml、 Beautiful Soup、 pyquery
4.1 使用 XPath
//title[@lang='eng'] :它代表选择所有名称为 title,同时属性 lang 的值为 eng 的节点
from lxml import etree html = etree.HTML() # 调用HTML类进行初始化 result = etree.tostring(html) # 输出修正后的HTML代码,结果为bytes类型 print(result.decode('utf-8')) # 转bytes类型为str类型
text()可以获取节点内部文本 ,用@符号获取节点属性
from lxml import etree text = ''' <li class="li li-first"><a href="link.html">first item</a></li> ''' html = etree.HTML(text) result = html.xpath('//li[@class="li"]/a/text()') print(result)
li 节点的 class 属性有两个值 li 和 li-first,此时如果还想用之前的属性民 配获取,就无法匹配了。
result =html.xpath(’//li[l]/a/text()’) print(result) result = html.xpath(’//li[last()]/a/text()’) print(result) result = html.xpath(’//li[position()<3]Ia/text()’) print (result) result = html.xpath(’//li[last()-2]/a/text()’) print(result)
第一次选择时,我们选取了第一个 li 节点,中括号中传入数字 l 即可 。 注意,这里和代码中不 同,序号是以 1开头的,不是以 0开头。
第二次选择时,我们选取了最后一个 li 节点,中括号中传入 last()即可,返回的便是最后一个 li节点。
第 三 次选择时,我们选取了位置小于 3 的 li 节点,也就是位置序号为 l 和 2 的节点,得到的结果 就是前两个 li节点。
第四次选择时,我们选取了倒数第三个 li 节点,中括号中传入 last()-2 即可 。 后一个,所以 last()-2就是倒数第三个
4.2 使用 Beautiful Soup
Beaut1也lSoup 自动将输入文档转换为 Unicode编码,输出文档转换为 UTF-8编码。 你不 需妥考虑、编码方式 ,除非文档没有指 定一个编码方式,这时你仅仅需妥说明一下原始编码方 式就可以了。
from bs4 import BeautifulSoup soup = BeautifulSoup('<p>hello</p>','lxml') #BeaufulSoup对象的初始化 如果使用lxml为解析器,那么第二参数用‘lxml’,同理其他一样
print(soup.p.string) # 读取p节点,调用string得到里面的文本
调用 prettify()方法。 这个方法可以把要解析的字符串以标准的缩进格式输出 。 这里需要 注意的是,输出结果里面包含 body和 html节点,也就是说对于不标准的 HTML字符串 BeautifolSoup, 可以自动更正格式 。 这一步不是由 prettify()方法做的,而是在初始化 Beautifol Soup 时就完成了 。
调用soup.title.string,这实际上是输出 HTML 中 title 节点的文本内容,所以,soup.title 可以选出 HTML 中的 title 节点,再调用 string 属性就可以得到里面的文本了。
调用 string 属性来获取文本的值
调用 name属性就可以得到节点名称
调用 attrs 获取所有属性 ,或者直接在节点元素后面加中括号,传入属性名就可以获取属性值。
parent属性,获取某个节点的父节点
parents 获取某个节点所有祖先节点,返回结果是生成器类型
next_sibling和previous_sibling分别获取下一个和上一个兄弟节点
next_siblings 和 previous_siblings 则分别返回所有前面和后面 的兄弟节点的生 成器
find all,顾名思义,就是查询所有符合条件的元素 。
attrs 除了根据节点名查询,我们也可以传入一些属性来查询 attrs 参数,参数的类型是字典类型
text参数可用来匹配节点的文本 ,传入的形式可以是字符串,可以是正则表达式对象
find()方法,只不过后者返回的是单个元素 ,也就是第一个匹配的元 素
find_parents()和find_parent(): 前者返回所有祖先节点, 后者返回直接父节点。
find_next_siblings()和find_next_sibling(): 前者返回后面所有的兄弟节点 , 后者返回后面
第一个兄弟节点
find_previous_siblings()和find_previous_sibling(): 前者返回前面所有的兄弟节点, 后者
返回前面第一个兄弟节点 。
find_all_next()和 find_next(): 前者返回节点后所有符合条件的节点,后者返回第一个符合 条件的节点
find_all_previous()和 find_previous():前者返回节点后所有符合条件的节点,后者返回第 一个符合条件的节点
7. css 选择器
使用 css选择器时,只需要调用 select()方法,传人相应的 css选择器即可 .
print(soup.select(’ul li’))
select(’ul li')则是选择所有 ul节点下面的所有 li节点,结果便是所有的 li节点组成的列表
for ul in soup.select('ul'):
print(ul. select(' li'))
select()方法同样支持嵌套选择。 例如,先选择所有 ul节点,再遍历每个 ul节点,选择其 li节
4.3 使用 pyquery
2. 初始化
·字符 串初始化
from pyquery import PyQuery as pq doc = pq(html) print(doc('li'))
•URL 初始化
from pyquery import PyQuery as pq doc = pq(url='http://cuiqingcai.com') print(doc('title'))
·文件初始化
除了传递 URL,还可以传递本地的文件名, 此时将参数指定为 干ilename 即可
3. 基本 css 选择器
from pyquery import PyQuery as pq
doc = pq(html)
print(doc(’#container .list li’))
传入了一个 css选择器#container .list li,它的意思是先 选取 id 为 container 的节点,然后再选取其内部的 class 为 list 的节点内部的所有 li 节点 。
4. 查找节点
·子节点
find()方法会将符合条件的所有节点选择出来,结果的类型是 PyQuery 类型 。
其实干 ind()的查找范围是节点的所有子孙节点,而如果我们只想查找子节点,那么可以用 children()方法
·获取属性
提取到节点之后,我们的最终目的当然是提取节点所包含的信息了 。 比较重要的信息有两类, 一 是获取属’性,二是获取文本
调用 attr()方法来获取属性