我正在尝试解析/打印来自 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.']
