python爬虫之xpath与BeautifulSoup
XPath的选取方法
xpath使用路径表达式可以在网页源代码中选取节点,沿着路径来选取的。
表达式 | 描述 |
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
在页面中右键点击【检查】,定位元素,右键选择【复制XPath】快速得到路径
完整的BeautifulSoup文档地址:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html#find-all
# BeautifulSoup import requests from bs4 import BeautifulSoup url = "https://bbs.tianya.cn/m/list-funinfo-1.shtml" headers = { 'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Mobile Safari/537.36' } r = requests.get(url, headers) soup = BeautifulSoup(r.text,"lxml") # 按照标准的缩进格式的结构输出 print(soup.prettify()) # 浏览结构化数据的方法 print(soup.title) # <title>娱乐八卦_论坛_天涯社区</title> print(soup.title.name) # title print(soup.title.string) # 娱乐八卦_论坛_天涯社区 print(soup.title.parent.name) # head print(soup.meta['charset']) # utf-8,只获取到了第一个,从上到下,只会输出第一个满足条件的值,完整的<p></p>所有的内容 print(soup.link) #<link href="http://bbs.tianya.cn/list-funinfo-1.shtml" rel="canonical"/> print(soup.find_all('meta')) print("=================================================================================================") print(soup.find(href="post-funinfo-7873792-1.shtml")) # 根据寻找的部分内容,输出包含它的最近的一层所有数据 print("=================================================================================================") # 从文档中找到所有<link>标签的链接 for link in soup.find_all('a'): print(link.get('href')) # 获取了所有div中的标题,get_text()用于获取文字 for title in soup.find_all('div',class_="p-title"): print(title.get_text()) # 对象的种类:Beautiful Soup 将复杂HTML文档转换成一个复杂的属性结构,每个节点都是python对象 # 对象归纳为4种:Tag,NavigableString,BeautifulSoup,Comment # Tag:与原生文档中的tag相同 tag = soup.div print(type(tag)) #<class 'bs4.element.Tag'> print(tag.name) #link tag.name = "blockquote" # tag = soup.div 修改了第一个div和最后一个(成对修改) print(tag) #<blockquote id="bbs_list"> print(tag['id']) # bbs_list print(tag.attrs) # {'id': 'bbs_list'} tag['id'] = 'change123' print(tag.attrs) # {'id': 'change123'} del tag['id'] print(tag.get('id')) # 已删除,None tag['id'] = 'this is a test' # 增加 #print(soup) print(soup.blockquote['id']) print("++++++++++++++++++++++++++++++++++++++++++") print(len(soup.contents)) print(soup.contents[0]) # 对子节点进行遍历 for child in tag.children: # 对tag子节点进行遍历 print(child)