今天在学习爬虫过程中,对一个标签<td>
中的字符串进行提取,用到td.string
,但总是输出None
,经过一番断点调试后,确定不是上下文程序的问题,开始对标签内容产生怀疑。
标签是这样的<td data-v-2a8fd7e4> 2 <!----></td>
,感觉是因为里面添了一个<!---->
造成的,手动去掉之后,果然输出了2.
在网上查找资料后,明白了为什么:
根据BeautifulSoup4官方文档 可以发现
1,当tag 包含了多个子节点,tag 就无法确定 .string 方法应该调用哪个子节点的内容, .string 的输出结果是 None。
2,text 返回的是标签的所有字符串连接成的字符串
首先先看一下这段代码
html = '<td> hello</td>'
soup = BeautifulSoup(html, 'html.parser')
td = soup.td
print(td.string) # hello
print(td.text) # hello
print(type(td.string)) # <class 'bs4.element.NavigableString'>
print(type(td.text)) # <class 'str'>
虽然.string和.text输出一样,但二者的类型是不一样的,string 属性的返回类型是 bs4.element.NavigableString
,而 text 属性的返回类型是 str
再来看下一段代码:
html = '<td>hello <b>world</b></td>'
soup = BeautifulSoup(html, 'html.parser')
td = soup.td
print(td.string) #None
print(td.text) #hello world
此时.string输出为None,而.text正常输出