beautifulsoup4:如何解析论坛帖子?

时间:2019-05-15 16:58:43

标签: python-3.x beautifulsoup pycharm

我在论坛软件中多次出现以下(简化的)数据结构:

<li id="post12345" class="anchorFixedHeader" style="order: 1">
  <div class="messagesidebar member" item-prop="author">
    <div class="messageauthor">
      <div class="messageauthorcontainer">
        <a id="mac12">
          <span class="username" itemprop="text">MostInnovativeUsernameEver</span>
        </a>
      </div>
    </div>
  </div>
  <div class="messagecontent">
    <div class="messagebody">
      <div class="messagetext" itemprop="text">
        Text before the quote.
        <blockquote class="quotebox">
          <div class="quoteboxcontent">
            <p>
              Hello, I'm a quote.
            </p>
          </div>
        </blockquote>
        Text after the class.
      </div>
    </div>
  </div>
</li>

对于每种情况,我要提取用户名,并为每个用户名对应的messagecontent。如果没有一个问题,我可以成功地做到这一点:报价。当我在控制台中打印提取的数据时,引号的数据结构(自然地)变得混乱了。

我(似乎)需要的是引号之前的文本,引号本身和引号之后的文本,以分别处理它们。我尝试了很多东西,但还没有在beautifulsoup中找到自己的出路。

U ...你们了解我想做什么吗?

1 个答案:

答案 0 :(得分:0)

好吧,如果我理解您的问题,这是一种解决方法:

import re

import bs4

html = """<li id="post12345" class="anchorFixedHeader" style="order: 1">
  <div class="messagesidebar member" item-prop="author">
    <div class="messageauthor">
      <div class="messageauthorcontainer">
        <a id="mac12">
          <span class="username" itemprop="text">MostInnovativeUsernameEver</span>
        </a>
      </div>
    </div>
  </div>
  <div class="messagecontent">
    <div class="messagebody">
      <div class="messagetext" itemprop="text">
        Text before the quote.
        <blockquote class="quotebox">
          <div class="quoteboxcontent">
            <p>
              Hello, I'm a quote.
            </p>
          </div>
        </blockquote>
        Text after the class.
      </div>
    </div>
  </div>
</li>"""

forum_posts = []
re_break_line = re.compile(r'[^\n].*')

soup = bs4.BeautifulSoup(html, features='html.parser')
posts = soup.find_all('li')
for post in posts:
    username = post.find('span', {'class': 'username'})
    content = post.find('div', {'class': 'messagecontent'})

    forum_post = {
        'username': username.text,
        'content': re_break_line.findall(content.text.replace('  ', ''))
    }
    forum_posts.append(forum_post)

print(forum_posts)

输出控制台:

[{'content': ['Text before the quote.', "Hello, I'm a quote.", 'Text after the class.'], 'username': 'MostInnovativeUsernameEver'}]