我想检查父标记是否具有名称不是“ 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)
AFAIC,也许这是因为
解析了&或nbsp,但是我不知道如何解决这个问题
您的代码还可以,但是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] 删除。
我来说两句