? xpath:是一种在XMl、html文档中查找信息的语言,利用了lxml库对HTML解析获取数据。
Xpath常用规则:
  nodename :选取此节点的所有子节点  // :从当前节点选取子孙节点  / :从当前节点选取子节点  . : 选取当前节点  .. : 选取当前节点父节点 @ : 选取属性
etree.parse()是初始化html构造一个XPath解析对象;
etree.tostring()是修复html文件中代码,把缺的头或尾节点补齐;
result.deode(‘utf-8‘)修复后的HTML代码是字节类型,转化成字符串;
from lxml import etreedhtml=etree.parse(‘c:/.../test.html‘,etree.HTMLParser())result=etree.tostring(html)result.decode(‘utf-8‘)
Xpath规则一般用 // 开头
例:html.xpath(‘//*‘) //获取所有的节点html.xpath(‘//li‘) //获取所有li节点
html.xpath(‘//li/a‘) //所有li下是所有直接a子节点html.xpath(‘//ul//a‘) //所有ul下的子孙a节点
html.xpath(‘//a[@href="links.html"]/../@class‘) //找到所有a节点中href为links.html的父节点的class值// .. 来实现查找父节点
html.xpath(‘//li[@class="item-0"]‘) //找到class值为item-0是节点
html.xpath(‘//li[@class="item-0"]/a/text()‘)或html.xpath(‘//li[@class="item-0"]//text()‘)
html.xpath(‘//li/a/@href‘) //找到li下a中的href属性值
html.xpath(‘//li[contains(@class,"li")]/a/text()‘) //只要节点属性class中包含li就能匹配出来
html.xpath(‘//li[contains(@class,"li") and @name="item"]/a/text()‘) //匹配节点属性class值为li,name值为item的节点
Beautiful Soup是HTML或XML解析库。通过解析文档为用户提供需要抓取的的数据。
基本用法:
from bs4 import BeautifulSoupsoup=BeautifulSoup(html,‘lxml‘)
调用prettify()方法把要解析的字符串以标准的缩进格式输出
例:soup.title.string
(1)选择元素: soup.title、soup.title.sring soup.head soup.p(2)提取信息:  1)获取节点名称:soup.title.name  2) 获取属性:soup.p.attrs、soup.p.attrs[‘name‘]  3) 获取内容:soup.p.string(3)嵌套选择:soup.head.title.string(4)关联选择:  enumerate() //生成器类型
(1)soup.p.contents //p节点下的直接子节点列表(2)soup.p.descendants //p节点下的所有子孙节点(生成器类型)(3)父节点和祖先节点:soup.p.partent、soup.p.parents(4)兄弟节点: soup.a.next_sibling soup.a.previous_sibling soup.a.next_siblings enumerate(soup.a.pervious_siblings)(5)提取信息:soup.a.next_sibling.string
find_all(name,attrs,recursive,text,**kwargs)
(1)name:find_all(name=‘li‘)(2)attrs:find_all(attrs={‘id‘:‘list-1‘})、find_all(class_=‘element‘)(3)text:匹配节点的文本,find_all(text=‘字符串或正则表达式‘)
特:find()用法与fand_all一样,只不过只匹配第一个元素
调用select()方法,传入相应css选择器
soup.select(‘.panel.panel-heading‘)soup.select(‘ul li‘) //所有ul下的所有lisoup.select(‘#list-2.element‘)
(1)嵌套选择:for ul in soup.select(‘ul‘): ul.select(‘li‘)(2)获取属性:for ul in soup.select(‘ul‘) ul.attrs[‘id‘] ul[‘id‘](3)获取文本:for li in soup.select(‘li‘): li.get_text() lli.string
1.初始化:
(1)字符串初始化:
html=‘‘‘ ******* ‘‘‘from pyquery import PyQuery as pqdoc=pq(html)print(doc(‘li‘))
(2)URL初始化
doc=pq(url=" https:/ ... ")
(3)文件初始化
doc=pq(filename=‘demo.html‘)
print(doc(li))
doc(‘#container .list li‘) //id 为container,class为list下的所有li
(1)子孙节点、子节点.find():查找所有子孙节点items=doc(‘.list‘)items.find(‘li‘).children():查找子节点items=doc(‘.list‘)items.children(‘.active‘)(2)父节点doc=pq(html)items=doc(‘.list‘)items.parent()祖先节点items.parents()(3)兄弟节点doc=pq(html)li=doc(‘.lsit .item-0.active‘)li.siblings(‘.active‘)
用items()函数生成列表生成器进行遍历
doc=pq(html)lis=doc(‘li‘).items()for li in lis: print(li)
(1)获取属性a=doc(‘.item-0.active a‘)print(a.attr(‘href‘))或print(a.attr.href)特:attr只会输出第一个a节点属性,要用items()遍历(2)获取文本.text()a=doc(‘.item-0.active a‘)a.text() //text()函数会输出所有的li文本内容.html()li=doc(‘li‘)li.html() //html()只会输出第一个li节点内的HTML文本
(1) removeClass addClassli=doc(‘.item-0.active‘)print(li)li.removeClass(‘active‘) //移除active的classli.addClass(‘active‘) //增加active的class(2) attr text htmlli.attr(‘name‘,‘link‘) //增加属性name=linkli.text(‘changed item‘) //改变文本 changed itemli.html(<span>changed item </span>) //改变HTML(3) remove()wrap=doc(‘.wrap‘)wrap.find(‘p‘).remove() //删除wrap中p节点wrap.text()
特:伪类选择器
选择第一个节点,最后一个节点,奇偶数节点,包含某一文本节点