beautysoup
# 介绍
BeautifulSoup 是一个 Python 库, 用于解析 HTML 和 XML 文档, 以提取其中的数据。它专注于页面解析和数据提取, 但不提供完整的爬虫框架。
BeautifulSoup 使数据解析更容易, 因为它提供了简单的 API, 可以轻松地遍历文档树并提取所需的信息。BeautifulSoup 适用于小型或中型的网页解析和数据提取任务
通常 Scrapy 和 BeautifulSoup 一起使用, Scrapy 用于构建和管理爬虫, 负责抓取网页并将其传递给 BeautifulSoup, 然后 BeautifulSoup 用于解析和提取所需的数据。这种组合允许你充分利用 Scrapy 的爬虫功能和 BeautifulSoup 的数据解析功能
在选择使用 Scrapy 还是 BeautifulSoup 时, 取决于你的具体需求。如果你需要构建一个完整的爬虫应用, Scrapy 可能更适合。如果你只需要解析和提取特定网页的数据, 那么 BeautifulSoup 可能足够了。另外, 还可以考虑使用 Scrapy 的扩展, 如 Scrapy-BeautifulSoup, 以在 Scrapy 中使用 BeautifulSoup 来解析页面
# 获取子元素
使用 BeautifulSoup, 你可以使用 .find() 方法来获取指定节点的第一个子元素
假设你已经将 HTML 文档解析为 BeautifulSoup 对象, 并且你有一个名为 sublineDom 的节点, 你可以使用以下方式获取它的第一个子元素:
first_child = sublineDom.find()
上述代码中的 .find() 方法没有传递任何参数, 这将返回 sublineDom 的第一个子元素。如果你希望通过标签名或其他属性来选择子元素, 可以将相应的参数传递给 .find() 方法
例如
- 如果你要获取 sublineDom 的第一个
<div>子元素, 可以使用以下代码:
first*div = sublineDom.find("div")
- 如果你希望获取具有特定类名的子元素, 可以传递
class\*参数:
first*child_with_class = sublineDom.find(class*="my-class")
请注意, .find() 方法只返回找到的第一个匹配的子元素。如果你想获取所有匹配的子元素, 可以使用 .find_all() 方法
- 获取子元素的最后一个节点
all_children = sublineDom.find_all()
if all_children:
last_child = all_children[-1]
print(last_child)
else:
print("sublineDom 没有子元素节点")
2
3
4
5
6
7
# href 正则
使用正则表达式匹配 href 属性的值, 以查找满足特定格式的链接。re.compile(r'user?id=') 将会编译一个正则表达式对象, 匹配以 user?id= 开头的 href 值
sublineDom.find("a", href=re.compile(r'user\?id='))
通过将选择器参数设置为 a 标签, 并将 href 属性与正则表达式进行匹配, 我们可以定位到所需的节点
# 获取父元素
如果你想要在 BeautifulSoup 中进行反向搜索, 即从一个节点向上搜索其父节点、祖先节点等, 可以使用 .find_parents() 或 .find_parent() 方法。)
.find_parents() 方法返回一个迭代器, 用于按顺序返回所有父节点和祖先节点。你可以对迭代器进行循环遍历来处理这些节点
以下是一个示例代码, 展示了如何使用 .find_parents() 方法进行反向搜索:
for parent in sublineDom.find_parents():
print(parent)
2
上述代码将打印出 sublineDom 节点的所有父节点和祖先节点
如果你只想获取第一个父节点或祖先节点, 可以使用 .find_parent() 方法:
parent = sublineDom.find_parent()
print(parent)
2
上述代码将返回 sublineDom 的第一个父节点或祖先节点
需要注意的是, 这些方法会返回与搜索条件匹配的节点, 如果你想要进一步筛选结果, 可以使用参数来指定标签名、类名等属性
# 获取兄弟节点
.find_next_sibling()方法来获取当前节点的下一个兄弟节点
以下是使用 .find_next_sibling() 方法的示例代码:
next_sibling = sublineDom.find_next_sibling()
上述代码中的 .find_next_sibling() 方法没有传递任何参数, 它将返回 sublineDom 的下一个兄弟节点。如果 sublineDom 没有下一个兄弟节点, 则返回 None
如果你希望通过标签名或其他属性来选择下一个兄弟节点, 可以将相应的参数传递给 .find_next_sibling() 方法
例如, 如果你要获取 sublineDom 的下一个 <div> 兄弟节点, 可以使用以下代码:
next*div_sibling = sublineDom.find_next_sibling("div")
如果你希望获取具有特定类名的下一个兄弟节点, 可以传递 class\* 参数:
next*sibling_with_class = sublineDom.find_next_sibling(class*="my-class")
请注意, .find_next_sibling() 方法只返回找到的第一个匹配的兄弟节点。如果你想获取所有匹配的兄弟节点, 可以使用 .find_next_siblings() 方法