我正在使用BeautifulSoup解析HTML
。最后,我想获取body
内容,但没有body
标记。但BeautifulSoup添加了html
,head
和body
标记。我this googlegrops discussion提出了一种可能的解决方案:
>>> from bs4 import BeautifulSoup as Soup
>>> soup = Soup('<p>Some paragraph</p>')
>>> soup.body.hidden = True
>>> soup.body.prettify()
u' <p>\n Some paragraph\n </p>'
这个解决方案是一个黑客。应该有一种更好,更明显的方法。
答案 0 :(得分:17)
你的意思是在身体标签之间获取所有东西吗?
在这种情况下,您可以使用:
import urllib2
from bs4 import BeautifulSoup
page = urllib2.urlopen('some_site').read()
soup = BeautifulSoup(page)
body = soup.find('body')
the_contents_of_body_without_body_tags = body.findChildren()
答案 1 :(得分:1)
我发现,仅获取主体内容的最简单方法是从body标签内部unwrap()
进行内容
>>> html = "<p>Hello World</p>"
>>> soup = BeautifulSoup(html, "html5lib")
>>> print(soup)
<html><head></head><body><p>Hello World</p></body></html>
>>>
>>> soup.html.unwrap()
<html></html>
>>>
>>> print(soup)
<head></head><body><p>Hello World</p></body>
>>>
>>> soup.head.unwrap()
<head></head>
>>>
>>> print(soup)
<body><p>Hello World</p></body>
>>>
>>> soup.body.unwrap()
<body></body>
>>>
>>> print(soup)
<p>Hello World</p>
要提高效率和可重用性,您可以将那些不需要的元素放在列表中并循环遍历...
>>> def get_body_contents(html):
... soup = BeautifulSoup(html, "html5lib")
... for attr in ['head','html','body']:
... if hasattr(soup, attr):
... getattr(soup, attr).unwrap()
... return soup
>>>
>>> html = "<p>Hello World</p>"
>>> print(get_body_contents(html))
<p>Hello World</p>