使用 python 从同名的 HTML div 框中提取信息

Pulling information from HTML div boxes with the same name using python

提问人:BotheredNow 提问时间:7/22/2023 最后编辑:BotheredNow 更新时间:7/25/2023 访问量:41

问:

所以基本上我一直在试图弄清楚如何抓取 bigo.tv 聊天,我遇到的第一个问题是如何提取发送到聊天的每条消息,首先,由于发送的每条聊天消息都被赋予了相同的 div 容器 id,并且 div 框的类与发送的消息类型不同(type1=chatMessages, type6=gifts),我附上了一张截图,演示了 type 6 聊天消息(gift)的 HTML 结构,我是一个非常基础的 python 程序员,我愿意学习和扩展我的知识,我只是迷失了从哪里开始,并且没有对这个主题感兴趣的朋友可以交谈。

Type6 聊天消息的 HTML 结构 (GIFT)

我期望用这个脚本完成什么:

  • 根据 div 类(type1、type6 等)将(用户级别、用户名、用户消息/礼物)提取到单独的文本文件中。

  • 脚本必须在整个实时流中持续运行,但不能重复已输入的任何条目。

就像我说的,我不是在要求代码,但指向正确方向的指针会非常有帮助!我一直在研究 beautifulsoup4,但作为一个不成熟的 Python 程序员,我正在努力寻找一个起点。

这是我试图用来获取至少一条聊天消息但没有成功的代码。

from bs4 import BeautifulSoup
import requests

r=requests.get("https://www.bigo.tv/875643864")
soup=BeautifulSoup(r.content,"html.parser")
div_text=soup.find("div",{"class":"user-text-content"}).get_text()
print(div_text)

我不得不附上错误的照片,因为我无法复制和粘贴它,因为我在 Chromebook 上并使用 pydroid3

终端错误

python html 循环 web-scraping beautifulsoup

评论

0赞 BotheredNow 7/22/2023
还是 urllib 会是要走的路?请任何帮助将不胜感激!
0赞 Robert 7/22/2023
请不要发布代码、错误、日志或其他文本的图像;请参阅如何提问。相反,编辑您的问题并包含您的代码,即使它只是不起作用的尝试。这样我们就可以使用一些东西,并且不会建议您已经尝试过的东西。
0赞 BotheredNow 7/22/2023
嗨,罗伯特,感谢您的回复,我已经更新了 OP。
0赞 Driftr95 7/25/2023
您必须登录才能聊天,甚至查看消息;虽然可能可以通过请求登录,但我建议尝试 selenium,特别是因为看起来您可能需要支持 javascript 的东西
0赞 BotheredNow 8/3/2023
@Driftr95感谢您的回复,selenium 是我选择的方式,我现在有一个脚本,可以收集第一个用户名和消息并将其添加到数据表中,但我正在努力让它等到它收集更多,截至目前,它只会吐出第一条消息并重复我指定的次数。我可以私信你吗,也许你可以看看我可能做错了什么?

答:

0赞 Prashant Patil 7/25/2023 #1

使用 BeautifulSoup 和 Requests 进行网络抓取,您走在正确的轨道上。但是,如果尝试查找的元素在页面上不存在,则可能会遇到错误。若要处理此类情况,应在尝试访问其属性之前检查该元素是否存在。

下面是一个简单的代码片段,可帮助您开始提取聊天消息:

from bs4 import BeautifulSoup
import requests

def scrape_chat_messages():
    url = "https://www.bigo.tv/875643864"
    r = requests.get(url)
    soup = BeautifulSoup(r.content, "html.parser")

    chat_messages = []

    # Find all chat message elements
    chat_elements = soup.find_all("div", {"class": "user-text-content"})

    for chat_element in chat_elements:
        # Extract the user level, user name, and user message/gift from the chat element
        user_level = chat_element.find("span", {"class": "user-level"}).get_text()
        user_name = chat_element.find("span", {"class": "user-name"}).get_text()
        user_message = chat_element.find("span", {"class": "message"}).get_text()

        # Append the extracted chat message to the list
        chat_messages.append({
            "user_level": user_level,
            "user_name": user_name,
            "user_message": user_message
        })

    return chat_messages

if __name__ == "__main__":
    messages = scrape_chat_messages()
    print(messages)