目录
为什么要学习xpath?
scrapy框架支持xpath提取
selenium 经常使用xpath提取
使用简洁 语法稍稍复杂
xpath是什么?
全称 xml path language
从xml中提取数据的语言
bs4按照标签名和属性进行查找, xpath 通过路径查找 也可以按照标签名和属性进行查找,通过一个具体的获得数据
html和lxml和xml:
html 超文本标记语言
xml 可扩展标记语言
lxml python的第三方库 使用lxml下的etree模块把html转化为lxml对象
转换之后才能进行xpath提取
怎么使用?
浏览器插件 chrome浏览器 xpath helper 直接在网页上就行xpath提取
- # 1 安装
- # pip install lxml
- # 2 导包
- # from lxml import etree
- # 3 把html文件转为lxml对象
- # xml = etree.HTML(网页源代码)
- # 4 使用xpath语句进行提取
- # xml.xpath(xpath语句)
- from lxml import etree
-
- xml_content = '''
-
-
aaa -
-
bookstore -
-
Harry Potter -
aaa -
333 -
JK.Rowing -
2005 -
29 -
-
-
- '''
-
- # 把html转化为lxml对象
- # 自动补全
- xml = etree.HTML(xml_content)
-
- # print(type(xml))
-
- # / 从根节点进行选取 默认返回列表
- title = xml.xpath('/html/body/bookstore/book/title')[0]
-
-
- # etree.tostring(xml,encoding='utf-8') 把lxml对象转为字符串
- # print(etree.tostring(xml,encoding='utf-8'))
-
- # print(etree.tostring(title,encoding='utf-8'))
-
- # // 从当前节点进行选取 不考虑标签的位置
- # /text()取出标签内的文本
- # print(xml.xpath('//bookstore//title/text()'))
-
- # [@属性名] 查找携带lang属性的title标签
- # *代表所有的标签名
- # print(xml.xpath('//*[@lang]/text()'))
- # print(xml.xpath('//title[@lang]/text()'))
-
- # [@属性名='属性值']
- # *可以用于代替属性名
- print(xml.xpath('//*[@*="aaa"]/text()'))
-
-
- # /title[2] 取出第n个title标签
- print(xml.xpath('//title[1]/text()'))
-
- # [/text()='xxxx'] 通过文本进行查找
- print(xml.xpath('//*[text()="aaa"]/text()'))
-
- # /@属性名 取出属性
- print(xml.xpath('//*[text()="bookstore"]/@lang'))
-
- # . 选取当前节点
- book = xml.xpath('//book/*')
-
- print(book.xpath('./title[1]/text()'))
-
- # for i in book:
- # print(i.xpath('./text()'))
- # https://xiaohua.zol.com.cn/lengxiaohua/
- # 需求 爬取标题和正文
- from lxml import etree
- from fake_useragent import UserAgent
- import requests
-
- def download(url):
- headers = {
- 'user-agent': UserAgent().random
- }
- html = requests.get(url=url,headers=headers)
- return html.text
-
- def get_dat(html):
- data_list = []
- xml = etree.HTML(html)
- # titile_list = xml.xpath('//span[@class="article-title"]/a[@target="_blank"]/text()')
- # print(titile_list)
- # text_list = xml.xpath('//div[@class="summary-text"]//text()')
- # print(text_list)
- # 先取大后取小
- li_list = xml.xpath('//ul[@class="article-list"]/li')
- for li in li_list:
- title = li.xpath('.//span[@class="article-title"]/a[@target="_blank"]/text()')
- # strip() 去除字符串头尾的空格 \n
- # text = li.xpath('.//div[@class="summary-text"]//text()')
- # 重点 推导式运用和列表脏数据清理
- text = ''.join([i.strip() for i in li.xpath('.//div[@class="summary-text"]//text()')])
- print(title)
- print(text)
- print('-'*100)
- return data_list
-
- # 获取下一页的url 没有则返回空
- def get_nexturl(html):
- xml = etree.HTML(html)
- next_url = xml.xpath("//a[text()='下一页']/@href")
- if next_url:
- return 'https://xiaohua.zol.com.cn/'+next_url[0]
- else:
- return None
-
-
-
- if __name__ == '__main__':
- url = 'https://xiaohua.zol.com.cn/lengxiaohua/'
- i = 0
- while True:
- html = download(url)
- get_dat(html)
- url = get_nexturl(html)
- i += 1
- print(i)
- if not url:
- break