python爬虫,使用xpath解析器、BeautifulSoup解析器、pyquery css解析器抽取结构化数据,使用正则表达式抽取非结构化数据

python爬虫,使用xpath解析器、BeautifulSoup解析器、pyquery css解析器抽取结构化数据,使用正则表达式抽取非结构化数据

测试文本:test.html

<div class="right-content">
<ul class="news-1" data-sudaclick="news_p">
<li><a href="https://news.sina.com.cn/c/2019-12-30/doc-iihnzhfz9312920.shtml" target="_blank">星的光点点洒于午夜 人人开开心心说说故事a>li> 
<li><a href="https://news.sina.com.cn/c/2019-12-31/doc-iihnzhfz9358830.shtml" target="_blank">偏偏今宵所想讲不太易 迟疑地望你想说又复迟疑a>li> 
<li><a href="https://news.sina.com.cn/c/2019-12-30/doc-iihnzhfz9330965.shtml" target="_blank">秋风将涌起的某夜 遗留她的窗边有个故事a>li> 
<li><a href="https://news.sina.com.cn/c/2019-12-31/doc-iihnzhfz9360933.shtml" target="_blank">孤单单的小伙子不顾寂寞 徘徊树下直至天际露月儿a>li>
ul>
div>

一.XPath解析器

简介

XPath,全称XML Path Language,即XML路径语言
官方教程:https://www.w3.org/TR/xpath/all/
常用语法:

表达式 描述
nodename 选取此节点的所有子节点
/ 选取所有子节点
// 选取所有子孙节点
. 选取当前节点
. . 选取当前节点的父节点
@ 选取属性

初始化

  • URL初始化
import requests
from lxml import etree

res = requests.get('https://news.sina.com.cn/china/')
res.encoding = 'utf-8'
html = etree.HTML(res.text)

html.xpath('//ul[@class="news-1"]/li/a/text()')
  • 文件初始化
from lxml import etree

# test.html以utf-8的编码格式保存,不会出现乱码
html = etree.parse('./test.html', etree.HTMLParser())

html.xpath('//ul[@class="news-1"]/li/a/text()')

实例

  • 获取属性值:@attr
  • 获取节点值:text()
  • 获取所有节点
    html.xpath(’//*’)
  • 精准匹配属性
    html.xpath(’//ul[@class=“news-1”]’)
  • 精准匹配标签
    html.xpath(’//a[text()=“星的光点点洒于午夜 人人开开心心说说故事”]/text()’)
  • 模糊匹配属性
    html.xpath(’//ul[contains(@class, “news”)]’)
  • 模糊匹配标签
    html.xpath(’//a[contains(text(), “开开心心”)]/text()’)
  • 若匹配多个节点,可按序选择,如下分别选择第一个、最后一个、倒数第二个、前三个
    html.xpath(’//ul[@class=“news-1”]/li[1]/a/text()’)
    html.xpath(’//ul[@class=“news-1”]/li[last()]/a/text()’)
    html.xpath(’//ul[@class=“news-1”]/li[last() - 1]/a/text()’)
    html.xpath(’//ul[@class=“news-1”]/li[position() <= 3]/a/text()’)
  • 节点轴选择:https://www.cnblogs.com/VseYoung/p/8686383.html

总结

  • 返回一个list,每个元素为lxml.etree._Element类型
  • 可以嵌套选择:response.xpath(.//)

二.Beautiful Soup

简介

Beautiful Soup是python的一个HTML或XML解析库
官网:https://www.crummy.com/software/BeautifulSoup/
文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/
依赖解析器:

解析器 使用方法
python标准库 BeautifulSoup(markup, “html.parser”)
lxml HTML 解析器 BeautifulSoup(markup, “lxml”)
lxml XML 解析器 BeautifulSoup(markup, “xml”)
html5lib BeautifulSoup(markup, “html5lib”)

初始化

  • URL初始化
import requests 
from bs4 import BeautifulSoup

res = requests.get('https://news.sina.com.cn/china/')
res.encoding = 'utf-8'
soup = BeautifulSoup(res.text, 'lxml')

soup
  • 文件初始化
from bs4 import BeautifulSoup

soup = BeautifulSoup(open('./test.html', 'r', encoding='utf-8'), 'lxml')

soup

实例

  • 找出class=“news-1”的ul下的所有li标签
soup.find_all(name="ul", attrs={"class": "news-1"})[0].find_all(name='li')
输出:
[<li><a href="https://news.sina.com.cn/c/2019-12-30/doc-iihnzhfz9312920.shtml" target="_blank">星的光点点洒于午夜 人人开开心心说说故事</a></li>,
 <li><a href="https://news.sina.com.cn/c/2019-12-31/doc-iihnzhfz9358830.shtml" target="_blank">偏偏今宵所想讲不太易 迟疑地望你想说又复迟疑</a></li>,
 <li><a href="https://news.sina.com.cn/c/2019-12-30/doc-iihnzhfz9330965.shtml" target="_blank">秋风将涌起的某夜 遗留她的窗边有个故事</a></li>,
 <li><a href="https://news.sina.com.cn/c/2019-12-31/doc-iihnzhfz9360933.shtml" target="_blank">孤单单的小伙子不顾寂寞 徘徊树下直至天际露月儿</a></li>]
  • 获取节点值
soup.find_all(name="ul", attrs={"class": "news-1"})[0].find_all(name='li')[2].a.string
输出:
'秋风将涌起的某夜 遗留她的窗边有个故事'
  • 获取属性值
soup.find_all(name="ul", attrs={"class": "news-1"})[0].find_all(name='li')[2].a['href']
输出:
'https://news.sina.com.cn/c/2019-12-30/doc-iihnzhfz9330965.shtml'

总结

  • 返回一个列表,每个元素为bs4.element.Tag类型
  • 可嵌套选择,通过find()或find_all()方法可筛选出大部分元素
  • 对于属性class,使用class_代替class传入参数筛选:soup.find_all(class_=‘element’)
  • 可调用CSS选择器:soup.select()

三.pyquery

简介

一个类似jQuery的python库,使用CSS选择器,比较soup.select()
官方文档:https://pythonhosted.org/pyquery/

初始化

  • URL初始化
import requests 
from pyquery import PyQuery as pq

#res = requests.get('https://news.sina.com.cn/china/')
#res.encoding = 'utf-8'
#doc = pq(res.text)
doc = pq(url='https://news.sina.com.cn/china/', encoding='utf-8')

doc
  • 文件初始化
import requests 
from pyquery import PyQuery as pq

#doc = pq(filename="./test.html",encoding='utf-8') #存在编码错误
doc = pq(open('./test.html', 'r', encoding='utf-8').read())

doc

实例

  • 获取节点值
next(doc('.news-1').find('a').items()).text()
输出:
'星的光点点洒于午夜 人人开开心心说说故事'
  • 获取属性值
next(doc('.news-1').find('a').items()).attr.href
输出:
'https://news.sina.com.cn/c/2019-12-30/doc-iihnzhfz9312920.shtml'

总结

  • 若选择结果为一个,为pyquery.pyquery.PyQuery对象
  • 若选择结果为多个,也为pyquery.pyquery.PyQuery对象,可调用items() 方法遍历,其返回一个生成器;或为list对象?,每个list元素为lxml.html.HtmlElement对象

四.正则表达式

import re
result = re.search(pattern, html, 修饰符)
if result:
	print(result.group(1), result.group(2))

五.json解析

  • json初始化后为列表类型
  • json字符串初始化:
    import json
    data = json.loads(str)
  • json文件初始化:
    import json
    data = json.loads(open(‘test.json’, ‘r’).read())

你可能感兴趣的:(python网络爬虫)