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)

 

posted @ 2020-11-20 17:48  Hskan  阅读(496)  评论(0编辑  收藏  举报