无法获得开始和结束标记之间的文本

时间:2017-04-05 11:39:14

标签: python beautifulsoup

soup = BeautifulSoup("<p>'hello'<a>'my link'</a></p>", 'html.parser')
print(soup.p.string)
None

输出是否正常?

3 个答案:

答案 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不能真正得到段落文本,因为里面有一个嵌套的标签。我认为当你试图获取文本时,它会递归地获取所有孩子的文本并将其附加到输出中。