网页解析返回的类型
网页的格式一般为HTML格式,在进行网页解析时若使用不同方法,对解析对象的格式要求也不一样,所以经常会发生格式上的转换。
HTML文件其实就是由一组尖括号构成的标签组织起来的,每一对尖括号形式一个标签,标签之间存在上下关系,形成标签树;
XPath 是一门在 XML 文档中查找信息的语言。
BeautifulSoup是一种在BeautifulSoup()处理后的树形文档中解析的语言
re正则表达式只能对string类型对象进行解析
下面可以看出他们的类型不同
import requests
from bs4 import BeautifulSoup
from scrapy.selector import Selector
from lxml import html
headers1={'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Mobile Safari/537.36'}
url='http://wh.lianjia.com/ershoufang/d2'
res=requests.get(url,headers=headers1)
#查看各类返回类型
In [5]: res.url
Out[5]: 'https://m.lianjia.com/wh/ershoufang/d2'
In [6]: type(res)
Out[6]: requests.models.Response
In [7]: type(res.text)
Out[7]: str
In [8]: type(res.content)
Out[8]: bytes
In [11]: tree=html.fromstring(res.text)#将string转换为HTML格式
In [12]: type(tree)
Out[12]: lxml.html.HtmlElement
houseInfo=tree.xpath('//div[@class="item_other text_cut"]//text()')
In [13]: html1=BeautifulSoup(res.text,'lxml')
In [14]: type(html1)
Out[14]: bs4.BeautifulSoup
names=html1.find_all("div",attrs={"class":"item_list"})
xpath解析
xpath语法内容可以查看以前的文章或者这篇Xpath语法和lxml用法简介
#用法简介:
from lxml import etree
#获取一个html文档
html = etree.parse(html.text)
result = etree.tostring(html, pretty_print=True)
print(result)
#(1)获取所有的标签
result = html.xpath('//li')
#(2)获取标签的所有 class
result = html.xpath('//li/@class')
#(3)获取标签下 href 为 link1.html 的标签
result = html.xpath('//li/a[@href="link1.html"]')
#(4)获取标签下的所有标签
result = html.xpath('//li//span') #因为span 只是在li 标签下面,并不是父子关系
#(5)获取所有li标签下的a标签中的所有 class的值,
result = html.xpath('//li/a//@class')
#(6)获取最后一个li标签的a标签中的 href
result = html.xpath('//li[last()]/a/@href')
#(7)获取倒数第二个元素的内容
result = html.xpath('//li[last()-1]/a')
print result[0].text
#(8)获取 class 为 bold 的标签名
result = html.xpath('//*[@class="bold"]')
print result[0].tag
#(9)找到所有 div 标签下 class 名为moco-course-wrap的类,并且具有target="_blank"的子标签 a标签
response.xpath('//div[@class="moco-course-wrap"]/a[@target="_blank"]')
#(10)找到当前节点下,选取href属性
box.xpath('.//@href')
#(11)找到当前节点下,所有的img标签(不一定是子标签),选取alt属性,提取文本内容
box.xpath('.//img/@alt').extract()[0]
#(12)找到当前节点下,所有的src属性,提取内容
box.xpath('.//@src').extract()[0]
#(13)找到当前节点下,所有的span标签下的文本内容
box.xpath('.//span/text()').extract()[0].strip()[:-3]
#(14)当前节点下,p标签的文本内容
box.xpath('.//p/text()').extract()[0].strip()
#(15)所有包含有 “下一页” 这个文本内容的a标签,提取这个a标签中的href属性值
url = response.xpath("//a[contains(text(),'下一页')]/@href").extract()
#(16)图片名称和地址
nodes_title = page.xpath('//div[@class="mtitle"]//text()')
print(len(nodes_title))
nodes_imgurl = page.xpath('//div[@style="text-align: center;"]//img/@src')
#http://wx2.sinaimg.cn/mw690/8903e1f3gy1ffq18eskojg20b4069e81.gif
BeautifulSoup解析
Beautiful Soup库解析器:lxml、html.parser、html5lib
#实例
import requests
from bs4 import BeautifulSoup
headers = {'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}
html = requests.get(url, headers=headers)
soup = BeautifulSoup(html.text, 'lxml') #以上是网络获取html
soup=BeautifulSoup(open('index.html')) # 读取本地的html,加个open函数即可
print(soup.prettify()) # 用标准html 显示方法打印html
#soup.find_all()方法介绍 ,soup.find()与之基本类似,只是返回的是第一个值
find_all( name , attrs , recursive , text , **kwargs )
soup.find_all('b') #查找所有的b标签,返回列表
soup.find_all(re.compile("^b")) # 正则表达式
soup.find_all(["a", "b"]) #传入列表参数,找到所有的a标签和b标签
soup.find_all(id='link2') #传入id是link2的参数,Beautiful Soup会搜索每个tag的”id”属性
soup.find_all(href=re.compile("elsie")) #传入正则表达式,查找所有的href标签内容中含有 elsie 的内容
soup.find_all(href=re.compile("elsie"), id='link1') # 多层过滤,除了href进行限定之外,对id标签的内容也做了限定
soup.find_all("div", class_="sister") #最常用的查找技巧,这里之所以加‘_=’是因为‘class’不仅是html中的tag,也是python语法的关键词,其他的不用加下划线
data_soup.find_all(attrs={"data-foo": "value"}) # 针对html5里面的data- 进行的专项查找
soup.find_all(text="Elsie") # 对text内容进行查找
soup.find_all(text=["Tillie", "Elsie", "Lacie"]) # 列表形式进行查找,与上面name类似
soup.find_all(text=re.compile("Dormouse")) # 正则表达式形式,与上面类似
# get_text()方法可以用来获取内容
print (soup.select('title')[0].get_text()) # 获取第一个title标签的对应内容
select()函数
我们在写 CSS 时,标签名不加任何修饰,类名前加点,id名前加 #,在这里我们也可以利用类似的方法来筛选元素,用到的方法是soup.select(),返回类型是list
(1)通过标签名查找
soup.select(‘title’)
(2)通过类名查找
soup.select(’.sister’)
(3)通过 id 名查找
soup.select(’#link1’)
(4)组合查找
组合查找即和写 class 文件时,标签名与类名、id名进行的组合原理是一样的,例如查找 p 标签中,id 等于 link1的内容,二者需要用空格分开
soup.select(‘p #link1’)
(5)属性查找
查找时还可以加入属性元素,属性需要用中括号括起来,注意属性和标签属于同一节点,所以中间不能加空格,否则会无法匹配到。
soup.select(‘a[class=“sister”]’)
soup.select(‘a[href=“http://example.com/elsie”]’)