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)   # 娱乐八卦_论坛_天涯社区
print(soup.title.name)  # title
print(soup.title.string)    # 娱乐八卦_论坛_天涯社区
print(soup.title.parent.name)   # head
print(soup.meta['charset'])     # utf-8,只获取到了第一个,从上到下,只会输出第一个满足条件的值,完整的

所有的内容
print(soup.link) # print(soup.find_all('meta')) print("=================================================================================================") print(soup.find(href="post-funinfo-7873792-1.shtml")) # 根据寻找的部分内容,输出包含它的最近的一层所有数据 print("=================================================================================================") # 从文档中找到所有标签的链接 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)) # print(tag.name) #link tag.name = "blockquote" # tag = soup.div 修改了第一个div和最后一个(成对修改) print(tag) #
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)