web-dev-qa-db-ja.com

BeautifulSoup-ボディコンテンツを取得するにはどうすればよいですか

BeautifulSoupでHTMLを解析しています。最後に、bodyの内容を取得したいのですが、bodyタグはありません。ただし、BeautifulSoupはhtmlhead、およびbodyタグを追加します。 I このgooglegropsディスカッション 1つの可能な解決策が提案されています:

>>> 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>'

このソリューションはハックです。それを行うためのより良い明白な方法があるはずです。

13
Philipp Zedler

ボディタグの間にすべてを入れるという意味ですか?

この場合、次を使用できます。

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(recursive=False)
22
Azwr

本文のコンテンツだけを取得する最も簡単な方法は、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>
1
Jeremy