首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >bs4 `next_sibling` VS `find_next_sibling`

bs4 `next_sibling` VS `find_next_sibling`
EN

Stack Overflow用户
提问于 2022-03-25 12:13:33
回答 1查看 398关注 0票数 2

我为next_sibling的使用而挣扎(与next_element类似)。如果作为属性使用,我不会得到任何返回,但是如果用作find_next_sibling (或find_next),那么它就能工作。来自文档

  • find_next_sibling:“遍历树中元素的其他兄弟节点。.返回(匹配的)第一个
  • find_next:“这些方法使用.next_elements迭代.并返回第一个方法”

因此,find_next_sibling依赖于next_siblingsnext_sibling所依赖的是什么,为什么他们什么也不返回?

代码语言:javascript
运行
复制
from bs4 import BeautifulSoup

html = """
<div class="......>
 <div class="one-ad-desc">
  <div class="one-ad-title">
   <a class="one-ad-link" href="www this is the URL!">
    <h5>
     Text needed
    </h5>
   </a>
  </div>
  <div class="one-ad-desc">
    ...and some more needed text here!
  </div>
 </div>
</div>
"""

soup = BeautifulSoup(html, 'lxml')

for div in soup.find_all('div', class_="one-ad-title"):
    print('-> ', div.next_element)
    print('-> ', div.next_sibling)
    print('-> ', div.find_next_sibling())-> ')
    break

输出

代码语言:javascript
运行
复制
->  

->  

->  <div class="one-ad-desc">
    ...and some more needed text here!
  </div>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-25 13:11:14

在我看来,这里的要点是.find_next_sibling()作用域位于树上的下一层上。

.next_element.next_sibling作用域位于解析树的相同级别的上。

因此,查看并打印元素的名称,您将看到下一个元素不是标记,因为树的同一级别上没有任何内容:

代码语言:javascript
运行
复制
for div in soup.find_all('div', class_="one-ad-title"):
    print('-> ', div.next_element.name)
    print('-> ', div.next_sibling.name)
    print('-> ', div.find_next_sibling().name)

#output
->  None
->  None
->  div

因此,如果您将输入更改为一行和no空格,则标记之间的.将得到以下结果:

代码语言:javascript
运行
复制
from bs4 import BeautifulSoup

html = """
<div class="......><div class="one-ad-desc"><div class="one-ad-title"><a class="one-ad-link" href="www this is the URL!"><h5>Text needed</h5></a></div><div class="one-ad-desc">...and some more needed text here!</div></div></div>"""

soup = BeautifulSoup(html, 'lxml')

for div in soup.find_all('div', class_="one-ad-title"):
    print('-> ', div.next_element)
    print('-> ', div.next_sibling)
    print('-> ', div.find_next_sibling())

输出:

代码语言:javascript
运行
复制
->  <a class="one-ad-link" href="www this is the URL!"><h5>Text needed</h5></a>
->  <div class="one-ad-desc">...and some more needed text here!</div>
->  <div class="one-ad-desc">...and some more needed text here!</div>

Note "text selected“不是在您选择的标签的同级中,而是在它的一个子标记中。选择“文本所需”的-> print('-> ', div.find_next().text)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71616816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档