soup = BeautifulSoup("<p>'hello'<a>'my link'</a></p>", 'html.parser')
print(soup.p.string)
None
输出是否正常?
答案 0 :(得分:2)
虽然<\p>
无效,但lxml会尝试关闭第一个标记,因此此代码有效。 html.parser在这个领域做得不好。
soup = BeautifulSoup("<p>'hello'<a>'my link'</a></p>", 'lxml')
print(soup.p.get_text(strip=True))
哪个输出:
'hello''my link'
答案 1 :(得分:1)
由于最初发布的<\p>
只是一个错字,这就是你的问题实际上是什么。
关于.string
BeautifulSoup
的工作原理。它的工作方式有所不同,具体取决于元素的子元素 - if an element has multiple children, it returns None
:
如果某个代码包含多个内容,则不清楚
.string
应引用的内容,因此.string
定义为None
请注意,.string
元素的p
如何None
,而a
则不是:
In [1]: from bs4 import BeautifulSoup
In [2]: soup = BeautifulSoup("<p>'hello'<a>'my link'</a></p>", 'html.parser')
In [3]: print(soup.p.string)
None
In [4]: print(soup.p.a.string)
'my link'
获取元素文本的正确且更可靠的方法是通过.get_text()
:
In [5]: print(soup.p.get_text(strip=True))
'hello''my link'
答案 2 :(得分:0)
>>>soup = BeautifulSoup("<p>adA<a>asda</a>asda</p>")
>>> soup.p
<p>adA<a>asda</a>asda</p>
>>> soup.p.text
u'adAasdaasda'
我认为Bs不能真正得到段落文本,因为里面有一个嵌套的标签。我认为当你试图获取文本时,它会递归地获取所有孩子的文本并将其附加到输出中。