如何使用Beautifulsoup4检查父标记是否具有名称不是“ div”的直接子代

宣誓就职

我想检查父标记是否具有名称不是“ div”的直接子代,因此我想检查标记的所有直接子代。我这样尝试过:

from bs4 import BeautifulSoup
import urllib.request

url = 'http://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/#contents-children'
req = urllib.request.Request(url)
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36')
website = urllib.request.urlopen(req)
html = website.read()
with open("web.html", "w", encoding='utf-8') as f:
    f.write(html.decode())
soup = BeautifulSoup(html, 'html.parser')
for item in soup.contents:
    print(item.name)

该项目有点复杂,因此我创建了这个小测试文件。我记得去年使用此软件包时是正确的。但是,当我使用python3.6 BeautifulSoup4.4.0运行此代码时,输​​出如下所示:

在此处输入图片说明

我尝试了所有解析器

    BeautifulSoup(markup, "html.parser")
    BeautifulSoup(markup, "lxml")
    BeautifulSoup(markup, "xml")
    BeautifulSoup(markup, "html5lib")

但是他们都是错的。而且html.parser甚至输出最差的结果:(因此,我的问题是如何正确获取子代?我只想要直接子代。

--------------------- 10 MIN LATER ------------------我试图将此测试代码修改为:

for item in soup.body.contents:
    print(item.name)

我得到其他标签的名称,它们之间有“ None”: 在此处输入图片说明

AFAIC,也许这是因为
解析&或nbsp,但是我不知道如何解决这个问题

安德烈·凯斯利(Andrej Kesely)

您的代码还可以,但是soup.contents您需要选择根<html>标记和一些NavigableString名称为的普通对象None尝试选择汤中的一些标签,例如选择all h3

for item in soup.select('h3'):
    print(item.text)

将打印:

Name¶
Attributes¶
tag的名字¶
.contents 和 .children¶
.descendants¶
.string¶
.strings 和 stripped_strings¶
.parent¶
.parents¶
.next_sibling 和 .previous_sibling¶
.next_siblings 和 .previous_siblings¶
.next_element 和 .previous_element¶
.next_elements 和 .previous_elements¶
字符串¶
正则表达式¶
列表¶
True¶
方法¶
name 参数¶
keyword 参数¶
按CSS搜索¶
string 参数¶
limit 参数¶
recursive 参数¶
智能引号¶
矛盾的编码¶
需要的解析器¶
方法名的变化¶
生成器¶
XML¶
实体¶
迁移杂项¶

编辑:

要检查<div>tag是否有任何子节点,其名称不是div,可以使用lambda函数:

for div_tag in soup.find_all('div'):
    if div_tag.find(lambda t: t.name != 'div'):
        print(div_tag.text)
        print('-' * 80)

编辑2:

要检查<div>tag是否有任何直接子级,其名称不是div,可以使用lambda函数和CSS选择器:

for div_tag in soup.select('div > *'):
    if div_tag.find(lambda t: t.name != 'div'):
        print(div_tag.text)
        print('-' * 80)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当父标记的子代具有特定属性值时,如何使用BeautifulSoup获取父标记的名称值?

CSS img不是的直接子代

如何获取div的所有子代的ID

当只有一个直接子代时,Java返回“ ScrollView只能容纳一个直接子代”

python BeautifulSoup在div的子代中获取所有href

如何获得div Jquery的所有后代子代

如何通过<a>使用Jquery在div内获取firs子代的值

是否有仅第一个直接子代的CSS选择器?

仅在javascript中获取标记名为<div>的子代

使用js cloneNode复制<div>模板并修改子代

Compose Navigation - 导航目的地 ... 不是此 NavGraph 的直接子代

为什么带有>符号(直接子代)的CSS选择器会覆盖默认样式?

TabControl样式在“绑定”和“直接子代”中看起来有所不同

将HTML元素添加为document.documentElement的直接子代有什么问题吗?

将div直接放在父div上方

当ID不确定时,如何选择具有已知ID的div的子代?

Active Record-如何在一个查询中获取所有直接和间接子代

如何在javascript或Jquery中获取父div内的子代数?

如何使用 puppeteer 检查 div 是否具有某个类?

使用JQuery检查父节中是否存在具有特定数据属性的子div

跳过给定类的所有后代(不仅仅是直接子代)的 jQuery 选择器

如何在SQL中拆分具有相同子代名称的两个xml标记

我如何隐藏除div及其所有子代之外的所有内容?

如何使静态div的子代出现在后面的静态div的子代之前?Z索引堆叠上下文

为什么父div浮动子代时其高度为零

将父div缩小为未知数量的浮动子代(css或js)

div越来越高不是直接父级

如何解决警告:validateDOMNesting(...):<div>不能作为<tbody>的子代出现

使用jQuery计算直接子div元素