xpath、BeautifulSoup和select()函数解析文档

网页解析返回的类型

网页的格式一般为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

BeautifulSoup标签说明

BeautifulSoup 的结构和用法简介

#实例

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”]’)

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用xpath爬取链家租房的房源数据,你可以使用Python中的相关库,如requests、bs4和xpath。首先,你需要发送HTTP请求获取网页的HTML内容,可以使用requests库来实现。然后,你可以使用BeautifulSoup库的解析器来解析HTML内容,并使用xpath表达式来提取所需的数据。 在代码中,你可以定义一个主函数,其中包含获取网页、解析HTML、提取数据和保存数据的步骤。你可以使用xpath表达式来选择和提取所需的信息,如房屋所在地区、小区名、户型、面积、朝向和价格等。你还可以使用pandas库将提取的数据保存到Excel文件中。 以下是一个简单的代码示例,用于使用xpath爬取链家租房的房源数据并保存到Excel文件中: ```python import requests from bs4 import BeautifulSoup import pandas as pd import lxml.etree as etree def get_html(url): response = requests.get(url) return response.text def parse_html(html): soup = BeautifulSoup(html, 'html.parser') return soup def extract_data(soup): data = \[\] listings = soup.select('div.content div.leftContent div.content__list--item') for listing in listings: area = listing.select_one('p.content__list--item--des a').text community = listing.select_one('p.content__list--item--des a:nth-of-type(2)').text layout = listing.select_one('p.content__list--item--des span:nth-of-type(1)').text size = listing.select_one('p.content__list--item--des span:nth-of-type(2)').text orientation = listing.select_one('p.content__list--item--des span:nth-of-type(3)').text price = listing.select_one('span.content__list--item-price em').text data.append(\[area, community, layout, size, orientation, price\]) return data def save_to_excel(data, filename): df = pd.DataFrame(data, columns=\['Area', 'Community', 'Layout', 'Size', 'Orientation', 'Price'\]) df.to_excel(filename, index=False) def main(num_pages, filename): base_url = 'https://bj.lianjia.com/zufang/pg{}' all_data = \[\] for page in range(1, num_pages+1): url = base_url.format(page) html = get_html(url) soup = parse_html(html) data = extract_data(soup) all_data.extend(data) save_to_excel(all_data, filename) if __name__ == '__main__': num_pages = int(input('请输入要爬取的页数:')) filename = 'lianjia_rent.xlsx' main(num_pages, filename) ``` 在这个示例中,我们定义了`get_html`函数来发送HTTP请求并获取网页的HTML内容。然后,我们使用BeautifulSoup库的解析器来解析HTML内容,并使用xpath选择器来提取所需的数据。最后,我们使用pandas库将提取的数据保存到Excel文件中。 请注意,这只是一个简单的示例,你可能需要根据具体的网页结构和需求进行适当的修改。另外,为了避免被网站反爬虫机制封禁,你可能需要添加一些反爬虫策略,如设置请求头、使用代理等。 #### 引用[.reference_title] - *1* [利用xpath爬取链家租房房源数据并利用pandas保存到Excel文件中](https://blog.csdn.net/renhongbin614/article/details/104540204)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [第二章 爬取案例-链家租房数据获取 2021-09-16](https://blog.csdn.net/qq_21438267/article/details/120337045)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值