【问题标题】:BeautifulSoup - how should I obtain the body contentsBeautifulSoup - 我应该如何获取正文内容
【发布时间】:2014-01-30 09:44:57
【问题描述】:

我正在使用 BeautifulSoup 解析 HTML。最后,我想获得body 的内容,但没有body 标签。但是 BeautifulSoup 添加了htmlheadbody 标签。我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>'

这个解决方案是一个 hack。应该有更好更明显的方法来做到这一点。

【问题讨论】:

  • 尽管有所有答案,但我仍然发现 .hiddden=True 方法是最干净的方法。如果字符串结果就足够了,另一个技巧是截断正文标签:str(soup.body)[6:-7]soup.body.prettify()[6:-7]

标签: python django beautifulsoup html5lib


【解决方案1】:

你的意思是让正文标签之间的所有内容?

在这种情况下,您可以使用:

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)

【讨论】:

  • 谢谢!当我有两个段落时,我应该使用''.join(['%s' % x for x in soup.body.findChildren()])之类的东西,还是有更好的方法?
  • 我在使用 findChildren 时遇到了一些问题,其中有些东西显得多余,因为它们嵌套在多个层中,并且是为每个包含层添加的。为了从正文中获取原始内容,没有任何冗余或怪异,我使用了pagefilling = ''.join(['%s' % x for x in soup.body.contents])
  • body.findChildren(recursive=False);帮助您避免两次嵌套元素。
【解决方案2】:

我发现仅获取正文内容的最简单方法是从正文标签中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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    相关资源
    最近更新 更多