xpath语法
/ # 从根节点选取
// # 从匹配选择的当前节点选择文档中的节点、而不考虑特们的位置
. # 选取当前节点
.. # 选取当前节点的父节点
@ # 选取
查找某个特定节点或包含某个特定值的节点
/bookstore/book[1] # 选取属于bookstore子元素的第一个book元素
/bookstore/book[last()] # 选取属于bookstore子元素的最后一个book元素
/bookstore/book[last()-1] # 选取属于bookstore子元素的倒数第二个book元素
/bookstore/book[position()<3] # 选取最前⾯的两个属于 bookstore 元素的⼦元素的 book 元素
//title[@lang] # 选取所有拥有名为 lang 的属性的title 元素
//title[@lang='eng'] # 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性
/bookstore/book[price>35.00] # 选取 bookstore 元素的所有 book元素,且其中的 price 元素的值须⼤于 35.00
选取未知节点
* # 匹配任何元素节点
@* # 匹配任何属性节点
node() # 匹配任何类型的节点
/bookstore/* #选取bookstore元素的所有子元素
//* # 选取文档中的所有元素
html/node()/meta/@* # 选择html下⾯任意节点下的meta节点的所有属性
//title[@*] # 选取所有带有属性的 title 元素
lxml库
"""
lxml 是一个HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML数据
利用etree.HTML,将字符串转化为Element对象
lxml可自动修正html代码
"""
from lxml import etree
html = etree.HTML(text) # 将字符串转化为 Element对象
print(etree.tostring(html).decode()) # 查看Element对象中包含字符串
爬虫案例
from lxml import etree
import requests
class BsSpider(object):
def __init__(self): # url地址
self.url = "http://budejie.com/{}"
self.header = {'User-Agent':....}
def get_url_list(self):
for page in range(1,10):
new_url = self.url.format(page)
url_list.append(new_url)
return url_list
# return [self.url.format(page) for page in range(1,10)]
def parse_url(self,url):
return requests.get(url,headers = self.header).text
def get_data_list(self,html_str):
html = etree.HTML(html_str)
li_list = html.xpath('//div[@class="j-r-list"]/ul/li')
content_list = []
for li in li_list:
item = {}
item['username'] = li.xpath("./div/divp[@class='u-txt']/a/text()")
item['comment'] = li.xpath("./div/divp[@class='j-r-list-c-desc']/a/text()")[0]
content_list.append(item)
return content_list
def save_content(self,content_list):
print(content_list)
def run(self): # 主函数
# 构造URL列表
url_list = self.get_url_list()
# 遍历URL,发送请求,获取响应
for url in url_list:
html = self.parse_url(url)
# xpath 提取数据
content_list = self.get_data_list(html)
# 保存
self.save_content(content_list)
if __name__ == '__main__':
bs = BsSpider()
bs.run()