【问题标题】:Get All Strings Between Two Different Tags获取两个不同标签之间的所有字符串
【发布时间】:2017-08-15 00:20:30
【问题描述】:
我正在尝试整理我与人们进行过的对话的聊天记录。我希望能够按名称、时间和文本将其分解。因为我正在提取的对话不在一个漂亮整洁的 CSV 文件中,所以我需要从源代码中抓取。我得到如下代码。有什么方法可以拉动<div class='message'> 和</p> 之间的所有字符串,以便我可以将每个单独的聊天消息与相应的发送者和发送时间放在一起?谢谢!
<div class="message"><div class="message_header"><span class="user">First Lastname</span><span class="meta">Tuesday, January 1, 2000 at 5:00pm EST</span></div></div><p>text here</p>
【问题讨论】:
标签:
python
regex
scrape
bs4
【解决方案1】:
您可以通过使用正则表达式来做到这一点。这是我想出的。注意正则表达式经过测试,但python代码不完整。但是,您应该能够弄清楚我在做什么。如果您需要更多关于正则表达式或实现方式的解释,请告诉我。我会调整我的答案。
import re
#Put this in a loop to get all files
line = #get line from file
m = re.match(r"<div class=\"message\">.*<span class=\"user\">(.*)<\/span><span class=\"meta\">(.*)<\/span>.*<p>(.*)<\/p>", line)
name = m.group(1) # The name
time = m.group(2) # Time
message = m.group(3) # Message
【解决方案2】:
能够用 BeautifulSoup 4 解决这个问题。幸运的是,用户、时间和消息的长度是相同的。我将每个用户、时间和消息分解到他们自己的列表中。然后使用 for 循环遍历每个列表并将每个用户、时间和消息的 [i] 一起匹配到一个列表中,然后附加到另一个列表。现在移植到 CSV 应该是小菜一碟。
texts = []
times = []
users = []
for text in soup.find_all('p'):
text = text.string
texts.append(text)
for time in soup.find_all('span', class_='meta'):
time = time.string
times.append(time)
for user in soup.find_all('span', class_='user'):
user = user.string
users.append(user)
conversations = []
for i in range(0,len(users)):
x = users[i]
y = times[i]
z = texts[i]
chat = [x , y, z]
conversations.append(chat)
print(conversations)