Skip to main content
 首页 » 编程设计

python之为什么此 RegEx 找不到任何数据

2025年05月04日14kerrycode

我正在尝试解析/打印来自 Twitter 的一些数据。我有一个打印推文的代码,但是当我尝试将相同的代码应用于用户名时,它似乎不起作用。我想在不使用 Twitter API 的情况下执行此操作。

这是我打印推文的内容

def main(): 
    try: 
        sourceCode = opener.open('https://twitter.com/search?f=realtime&q='\ 
                                 +keyWord+'&src=hash').read() 
        splitSource = re.findall(r'<p class="js-tweet-text tweet-text">(.*?)</p>', sourceCode) 
        print len(splitSource) 
        print splitSource 
        for item in splitSource: 
            print '\n _____________________\n' 
            print re.sub(r'<.*?>','',item) 
 
 
 
    except Exception, e: 
        print str(e) 
        print 'error in main try' 
        time.sleep(555) 
 
main() 

现在要打印用户名信息,我将“opener”更改为“browser”,但它仍会找到并打开页面,所以这不是问题所在。反正我不这么认为。

def main(): 
    try: 
        pageSource = browser.open('https://twitter.com/search?q='\ 
                                 +firstName+'%20'+lastName+'&src=hash&mode=users').read() 
        splitSource = re.findall(r'<p class="bio ">(.*?)</p>', pageSource) 
        for item in splitSource: 
            print '\n' 
            print re.sub(r'<.*?>','',item) 
    except Exception, e: 
        print str(e) 
        print 'error in main try' 
 
 
main() 

它将打印源代码。问题似乎在于:

splitSource = re.findall(r'<p class="bio ">(.*?)</p>', pageSource) 

这似乎根本找不到任何东西。这是我试图从中提取信息的来源的副本。

  <div class="content"> 
    <div class="stream-item-header"> 
      <a class="account-group js-user-profile-link" href="/BarackObama" > 
        <img class="avatar js-action-profile-avatar " src="https://pbs.twimg.com/profile_images/451007105391022080/iu1f7brY_normal.png" alt="" data-user-id="813286"/> 
        <strong class="fullname js-action-profile-name">Barack Obama</strong><span class="Icon Icon--verified Icon--small"><span class="u-isHiddenVisually">Verified account</span></span> 
          <span class="username js-action-profile-name">@BarackObama</span> 
 
 
      </a> 
    </div> 
      <p class="bio "> 
          This account is run by Organizing for Action staff. Tweets from the President are signed -bo. 
      </p> 
 
 
 
 
 
 
 
  </div> 

我觉得这个来源中发生了一些事情,阻止我获取生物信息。间距可以吗?我不知道。

请您参考如下方法:

As usual, don't use regex to parse HTML.

实际上,您的 '<p class="bio ">' 之间有一个换行符和你的 '(.*?)'这意味着你需要使用 re.DOTALL匹配所以 .将包括换行符。你也可以做 '<p class="bio ">\s*(.*?)\s*</p>' , 自 \s将匹配换行符(如果存在)。这也将提供更清洁的输出。

import re 
 
pat = re.compile(r'<p class="bio ">\s*(.*?)\s*</p>') 
pat.findall(src) # src is your last codeblock from above 
## OUTPUT: 
['This account is run by Organizing for Action staff. Tweets from the President are signed -bo.'] 

如果您想使用 BeautifulSoup 选项,Python3 代码如下:

from bs4 import BeautifulSoup 
 
soup = BeautifulSoup(src) # src is your last codeblock from your question 
[p_bio.contents.strip() for p_bio in soup('p' class_='bio ')] 
## OUTPUT: 
['This account is run by Organizing for Action staff. Tweets from the President are signed -bo.']