XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。
(1)基本介绍
/ 从根节点选取,
// 从所有匹配的节点选取
. 当前节点,
.. 当前的父节点
nodename 选取节点,
@ 选取节点的属性
通赔符 *, 选取若干路径用 | 分割
text() 选取该节点的文本内容
//img/@src: 选取所有img 节点的src属性
//img/../text 选取img节点的父节点下的text节点
//*/@src 选取任何节点的src 属性
(2)找到属性
result = html.xpath('//a/@href')
print(result)
(3)找文本
# 如果找某一标签的文本,而这个变迁下面还有其他的标签
# 那么只找这个标签的文本,子标签的文本不找。
result = html.xpath('//div/text()')
print(result)
# //text() 找到本标签以及所有子标签的文本
result = html.xpath('//div//text()')
for name in result:
print(name)
string 也是一种函数方法,可以提取子标签的文本
content = code.xpath('//div[@class="p_content "]/cc/div')
for i in content:
print(i.xpath('string(.)'))
(4)根据指定的标签寻找
result = html.xpath('//ul/li/a[@id="jd"]/text()')
print(result[0])
eautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据
(1) 获取属性值
bs = BeautifulSoup('index.html', 'lxml')
print(bs.a['href'])
(2) 获得文本
# string 获取的文本指的是本标签的文本
# 不包含子标签的文本
print(bs.div.string)
这种办法可以获得子标签的文本
content = soup.select('div.p_content cc div')
for i in content:
print(i.get_text())
(3) find 与 find_all
Html中的class 和id 不一样,id 必须是唯一的, 一个标签只能有一个ID
class 不是唯一的,不同的标签可以拥有同一个class,同一个标签也可以拥有多个class
# id 是唯一的,通过id 只能找一个,所以用find
print(bs.find(id="jd"))
# class 不是唯一的,通过class 来找 可能找到多个
# 注意class_ 这里有一个下划线
print(bs.find_all(class_="shopping"))
# find_all 是列表 ,find 是字符串
(4) select 的用法
# select--选择指定的标签
print(bs.select('title'))
# 当选择的对象有多个的时候,就获取多个的对象
print(bs.select('a'))
# . 表示类名 # 表示id
print(bs.select('.first'))
print(bs.select('#jd'))
表示根据层级关系寻找
soup.select('li.d_name a')
import re
from bs4 import BeautifulSoup
from lxml import etree
import requests
class SpiderCompare(object):
def __init__(self):
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36'
' (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
def get_code(self):
response = requests.get('https://tieba.baidu.com/p/5743456239?pn=1', headers=self.headers).text
return response
def use_re(self, code):
pattern = re.compile(r'(.*?)'
r'.*?(.*?)
from bs4 import BeautifulSoup
from lxml import etree
import requests
# 这是网页源码提取的部分
'''
'''
class TianTangSpider(object):
def get_code(self):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36'
' (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}
response = requests.get('http://www.ivsky.com/tupian/meishishijie/', headers=headers).text
return response
def use_xpath(self, code):
code = etree.HTML(code)
# 因为a标签下面嵌套着img标签,这里只获取a标签的href 属性
href = code.xpath('//div[@class="il_img"]/a')
for i in href:
print(i.get('href'))
image_list = code.xpath('//div[@class="il_img"]/a/img')
for name in image_list:
src = name.get('src')
alt = name.get('alt')
def use_soup(self, code):
soup = BeautifulSoup(code, 'lxml')
image_list = soup.select('div.il_img img')
for name in image_list:
src = name.get('src')
alt = name.get('alt')
def func_manager(self):
code = self.get_code()
self.use_xpath(code)
self.use_soup(code)
tian = TianTangSpider()
tian.func_manager()
code = etree.HTML(code)
src_list = code.xpath('//div[@class=]/a/div')
# 注意//必须写,表示在根目录开始找,也可以在某个嵌套循环里不写,
soup = BeautifulSoup(code, 'lxml')
src_list = soup.select('div.类名 img ')
# 标签与属性是通过.连接的 到下一级标签使用 空格 连接的。