Advanced HTML Parsing

1.get_text

  • get text() 会删除文档中的所有标记,并返回一个仅包含文本的 Unicode 字符串。例如,如果你正在处理一个包含许多超链接、段落和其他标记的大文本块,所有这些标记都将被剥离,只留下一个无标记的文本块。
  • 请记住,在 BeautifulSoup 对象中找到你要找的内容要比在文本块中容易得多。调用.get_text()应该是你最后要做的事情,尤其是在打印、存储或处理最终数据之前。一般来说,您应尽可能长时间地保留文档的标记结构。
nameList = bs.findAll('span', {'class': 'green'})
for name in nameList:
    print(name.get_text())

2.BeautifulSoup的find()和find_all()

1)函数形式

  • find_all(tag, attributes, recursive, text, limit, keywords)
  • find(tag, attributes, recursive, text, keywords)

2)函数参数解释

tag:如span、h1、h2;

titles = bs.find_all(['h1', 'h2','h3','h4','h5','h6'])
print([title for title in titles])

attributes:表示该内容的属性或者的样式,如代码中{'class':{'green', 'red'}}部分;

allText = bs.find_all('span', {'class':{'green', 'red'}})
print([text for text in allText])

recursive:是一个布尔参数,如果参数为True,会检索所有的层级;如果参数为False,则只会检索第一层的tags。该参数默认为True。

text:文本参数的不同之处在于,它根据标记的文本内容而不是标记本身的属性进行匹配。例如,如果要查找示例页面中 "王子 "被标签包围的次数。

nameList = bs.find_all(text='the prince')

limit:是find_all()的参数,当limit=1时,find_all()与find()的效果一样,都是寻找第一个符合条件的数据;

3.next_siblings()

next_siblings 是一个Beautiful Soup库中的方法,它允许你在文档树中获取当前元素之后的所有同级元素(即具有相同父元素的其他元素)。这个方法返回一个生成器对象,通过迭代该生成器对象,你可以逐个访问当前元素之后的所有同级元素。

例如,如果你有一个HTML文档如下:

<html>
<head>
  <title>Example</title>
</head>
<body>
  <div id="content">
    <p>Paragraph 1</p>
    <p>Paragraph 2</p>
    <p>Paragraph 3</p>
  </div>
</body>
</html>

 假设你正在使用Beautiful Soup来解析这个文档,并且你已经选择了第一个 <p> 元素,那么你可以使用 .next_siblings 方法来获取该元素之后的所有 <p> 元素。例如:

from bs4 import BeautifulSoup

html_doc = """
<html>
<head>
  <title>Example</title>
</head>
<body>
  <div id="content">
    <p>Paragraph 1</p>
    <p>Paragraph 2</p>
    <p>Paragraph 3</p>
  </div>
</body>
</html>
"""

soup = BeautifulSoup(html_doc, 'html.parser')
first_p = soup.find('p')  # 选择第一个 <p> 元素
for sibling in first_p.next_siblings:
    print(sibling)

上述代码将打印出第一个 <p> 元素之后的所有 <p> 元素的文本内容:

<p>Paragraph 2</p>
<p>Paragraph 3</p>

这样,你就可以逐个访问并处理当前元素之后的同级元素。

4.RegEx

4.1Re module

正则表达通常需要借助于Re module来实现。Re module中常用的表达式:

4.2 原始字符r

在 Python 中,前缀 r 表示一个"原始字符串"(raw string)。使用原始字符串时,Python 解释器会将字符串中的转义字符(如 \n, \t)视为普通字符,而不是特殊字符。这在处理正则表达式时尤其有用,因为正则表达式中常常包含反斜杠 \,而原始字符串会使得反斜杠不被转义。

例如,如果你有一个正则表达式模式是 "\b",用来匹配单词边界,但是你希望在字符串中直接表示这个模式而不是转义字符,你可以使用原始字符串来定义这个模式,如 r"\b"

4.3 常用的正则表达符号

 

5.re.compile()

re.compile() 是 Python 中 re 模块中的一个函数,用于将正则表达式编译成一个可重复使用的正则表达式对象。通常,当你需要在代码中多次使用同一个正则表达式时,使用 re.compile() 可以提高匹配效率。

使用 re.compile() 的基本语法是:

re.compile(pattern, flags=0)
  • pattern 是一个字符串,表示要编译的正则表达式模式。
  • flags 是一个可选参数,用于指定正则表达式的匹配选项。例如,可以通过传递 re.IGNORECASE 来忽略大小写。

re.compile() 返回一个正则表达式对象,你可以使用这个对象的方法进行匹配操作,比如 search()match()findall() 等。

例如,假设你有一个需要多次使用的正则表达式模式,你可以使用 re.compile() 编译它,然后多次调用该对象的方法进行匹配:

import re

# 编译正则表达式模式
pattern = re.compile(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b')

# 使用编译后的正则表达式对象进行匹配
email1 = "example@example.com"
email2 = "another_example@example.co.uk"
if pattern.match(email1):
    print("Valid email")
if pattern.match(email2):
    print("Valid email")

在这个例子中,re.compile() 编译了一个用于匹配电子邮件地址的正则表达式模式,然后使用这个编译后的正则表达式对象进行了两次匹配。 

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值