《Python 网络数据采集》正则表达式
- 如果你用过 Python 2.x 里的 urllib2 库,可能会发现 urllib2 与 urllib 有些不同。在 Python 3.x 里,urllib2改名为 urllib,被分成一些子模块: urllib.request 、urllib.parse 和 urllib.error 。尽管函数名称大多和原来一样,但是在用新的 urllib 库时需要注意哪些函数被移动到子模块里了。
urlopen 用来大家并读取一个从网络获取的远程对象。
from urllib.request import u rlopen
html = urlopen("http://pythonscraping.com/pages/page1.html")
print(html.read())
- BeautifulSoup通过定位 HTML 标签来格式化和组织复杂的网络信息,用简单易用的 Python 对象为我们展现 XML 结构信息。
from urllib.request import urlopen
from urllib.error import HTTPError
from bs4 import BeautifulSoupdef getTitle(url):try:html = urlopen(url)except HTTPError as e:print(e)return Nonetry:bsObj = BeautifulSoup(html.read(), "lxml")title = bsObj.body.h1except AttributeError as e:print(e)return Nonereturn titletitle = getTitle("http://pythonscraping.com/pages/page1.html")
if title == None:print("Title could not be found!")
else:print(title)
- 复杂的HTML解析
from urllib.request import urlopen
from urllib.error import HTTPError
from bs4 import BeautifulSouptry:html = urlopen("http://www.pythonscraping.com/pages/warandpeace.html")
except HTTPError as e:print(e)try:bsObj = BeautifulSoup(html, "lxml")
except AttributeError as e:print(e)namelist = bsObj.findAll("span", {"class":"green"})
for name in namelist:print(name.get_text())
- findAll()和find()
findAll(tag, attributes, recursive, text, limit, keywords)
find(tag, attributes, recursive, text, keywords)
tag::传一个标签名称或多个标签组成的列表
attributes:传一个Python字典封装一个标签的若干属性和属性值。例如:.findAll("span", {"class":{"green", "red"}})
recursive:是一个递归参数,要求传一个布尔变量,默认值是Ture,所以findAll默认会去查找标签参数的所有子标签,以及子标签的子标签。改为False,findAll就至查找文档的以及标签。
text:用标签的文本内容去匹配,而不是标签的属性。
limit:范围限制参数,显然只用于findAll,find其实等价与findAll中的limit=1的情况。limit参数设置后,它的返回的前limit项结果是按照网页上的顺序排序的。
keyword:可以让你选择指定属性的标签,是BeautifulSoup设置的一个冗余功能,可替代,且偶尔会出现问题。例如bsObj.findAll(class="green"),会产生一个语法错误,因为class是Python的保留字。
- get_text()
.get_text() 会把你正在处理的 HTML 文档中所有的标签都清除,然后返回一个只包含文字的字符串。假如你正在处理一个包含许多超链接、段落和标签的大段源代码,那么 .get_text() 会把这些超链接、段落和标签都清除掉,只剩下一串不带标签的文字。
- 导航树
- 子标签和后代标签
from urllib.request import urlopen
from urllib.error import HTTPError
from bs4 import BeautifulSouptry:html = urlopen("http://www.pythonscraping.com/pages/page3.html")
except HTTPError as e:print(e)try:bsObj = BeautifulSoup(html, "lxml")
except AttributeError as e:print(e)for child in bsObj.find("table", {"id":"giftList"}).children:print(child)
- 处理兄弟标签
from urllib.request import urlopen
from urllib.error import HTTPError
from bs4 import BeautifulSouptry:html = urlopen("http://www.pythonscraping.com/pages/page3.html")
except HTTPError as e:print(e)try:bsObj = BeautifulSoup(html, "lxml")
except AttributeError as e:print(e)for sibling in bsObj.find("table", {"id":"giftList"}).tr.next_siblings:print(sibling)
- 父标签处理
from urllib.request import urlopen
from urllib.error import HTTPError
from bs4 import BeautifulSouptry:html = urlopen("http://www.pythonscraping.com/pages/page3.html")
except HTTPError as e:print(e)try:bsObj = BeautifulSoup(html, "lxml")
except AttributeError as e:print(e)print(bsObj.find("img", {"src":"../img/gifts/img1.jpg"}).parent.previous_sibling.get_text())
- 正则表达式
邮箱:[A-Za-z0-9\._+]+@[A-Za-z]+\.(com|org|edu|net)
from urllib.request import urlopen
from urllib.error import HTTPError
from bs4 import BeautifulSoup
import retry:html = urlopen("http://www.pythonscraping.com/pages/page3.html")
except HTTPError as e:print(e)try:bsObj = BeautifulSoup(html, "lxml")
except AttributeError as e:print(e)images = bsObj.findAll("img", {"src":re.compile("\.\.\/img\/gifts\/img.*\.jpg")})
for img in images:print(img["src"])
- 获取属性
- 对于一个标签可以用myTag.attrs获取所有属性
- myTag.attrs["src"]表示myTag的src的属性
from urllib.request import urlopen
from urllib.error import HTTPError
from bs4 import BeautifulSoup
import retry:html = urlopen("http://www.pythonscraping.com/pages/page3.html")
except HTTPError as e:print(e)try:bsObj = BeautifulSoup(html, "lxml")
except AttributeError as e:print(e)images = bsObj.findAll("img", {"src":re.compile("\.\.\/img\/gifts\/img.*\.jpg")})
for img in images:print(img.attrs["src"])
《Python 网络数据采集》正则表达式相关推荐
- 通过正则表达式校验手机号码,拿走即用!
校验手机号码 2021/01/06更新,电信新增了191号段 1. 单纯校验长度 2.正则表达式校验数字 3.正则表达式校验是否是大陆号码 4.正则表达式校验是否是香港号码 //校验长度private ...
- Linux shell 学习笔记(15)— shell 正则表达式
1. 定义 BRE 模式 1.1 纯文本 第一条原则就是:正则表达式模式都区分大小写.这意味着它们只会匹配大小写也相符的模式. $ echo "This is a test" | ...
- re2正则表达式匹配引擎的c接口版本cre2的中文使用手册
前言 re2 官方地址: https://github.com/google/re2 cre2 官方地址: https://github.com/marcomaggi/cre2 1 基本类型定义 不透 ...
- 正则表达式(括号)、[中括号]、{大括号}的区别小结
正则表达式(括号).[中括号].{大括号}的区别小结 </h1><div class="clear"></div><div class=& ...
- Python中正则表达式用法 重点格式以这个为准_首看_各种问题
20210811 https://www.jb51.net/article/101258.htm 一.惰性模式的概念: 此模式和贪婪模式恰好相反,它尽可能少的匹配字符以满足正则表达式即可,例如: va ...
- 正则语法完全正则表达式手册_语法格式重点
20211202 https://blog.csdn.net/lc11535/article/details/103266263 该表达式打开re.U(re.UNICODE)标志. python –& ...
- 正则表达式 - 语法
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串.将匹配的子串替换或者从某个串中取出符合某个条件的子串等. 例如: r ...
- 正则表达式中的\.表示什么意思
\ 这是引用符,用来将这里列出的这些元字符当作普通的字符来进行匹配.例如正则表达式\$被用来匹配美元符号,而不是行尾,类似的,正则表达式\.用来匹配点字符,而不是任何字符的通配符.
- ?:在正则表达式中什么意思
"?:"非获取匹配,匹配冒号后的内容但不获取匹配结果,不进行存储供以后使用. 单独的"?":匹配前面的子表达式零次或一次. 当"?"紧跟在任 ...
- 关于正则表达式 \1 \2之类的问题
我们创建一个正则表达式 var RegExp = /^(123)(456)\2\1$/; 这个正则表达式匹配到的字符串就是 123456456123 创建另外第二正则表达式 var RegExp1 = ...
最新文章
- loj #6053 简单的函数 min_25筛
- Linux 增大Swap
- redis分片_5000+字硬核干货!Redis 分布式集群部署实战
- java launcher 下载_Java Launcher下载并安装
- html文件设置断点调试,断点调试
- 多线程的那点儿事(之嵌套锁)
- Java程序员须知的七个日志管理工具
- Git版本控制:Git远程仓库
- 你对自己未来五年的职业规划是什么
- 苹果开发者证书报错证书不受信任
- grunt源码解析1——如何安装grunt:grunt命令是怎样运行起来的
- Cauchy distribution
- 源中瑞区块链baas平台一站式服务体系
- thinkphp6学习教程与源码 tp6开源CMS系统源码研究
- 学习笔记——数据的度量
- 闽江学院计算机与控制工程学院在哪个校区,计算机与控制工程学院举行优秀校友分享会...
- Linux基础命令-进程与系统性能
- 量化选股——基于动量因子的行业风格轮动策略(第2部分—策略回测)
- python的内存调优_python内存机制与垃圾回收、调优手段
- 通过修改rom包永久获取root权限和所有应用调试功能ro.debuggable