如何用Selenium Python提取HTML容器中的指定文本?
问题:提取Facebook消息容器中的文本内容
获取消息容器的代码
messages_blocks = driver.find_elements(By.CLASS_NAME, "x1fqp7bg")
容器的HTML结构
<div class="xeuugli x2lwn1j xuk3077 x78zum5 x1q0g3np x1nhvcw1 x1jchvi3 xlxfd2w x1gslohp x126k92a"><div class="x1rg5ohu x67bb7w"><img class="x6umtig x1b1mbwd xaqea5y xav7gou x14yjl9h xudhj91 x18nykt9 xww2gxu x1ypdohk x1lliihq img" alt="Manuel Marchie" src="https://scontent-vie1-1.xx.fbcdn.net/v/t1.30497-1/84628273_176159830277856_972693363922829312_n.jpg?stp=c59.0.200.200a_dst-jpg_p200x200&_nc_cat=1&ccb=1-7&_nc_sid=12b3be&_nc_ohc=O7CR_V32jMkAX-d2qoC&_nc_ht=scontent-vie1-1.xx&oh=00_AfCWMM9EsteVjxrm3mKJ4Qo-tRDbpMOHRYyY53yuob1TWQ&oe=64D74E19" width="32" height="32"></div><div class="xeuugli x2lwn1j x6s0dn4 x78zum5 x1q0g3np x193iq5w xh8yej3"><div class="xeuugli x2lwn1j x1cy8zhl x78zum5 xdl72j9 xdt5ytf x1c4vz4f x2lah0s x16fdfms x161msgk x1s9ed0f x1eapu41 x1r944mn xet2fuk"><div class="x1rg5ohu x67bb7w"><div class="x1y1aw1k xn6708d xwib8y2 x1ye3gou x13faqbe x1eied1y xca6lcq x1pdtjp8 xpctjk2 xogfrqt x1slwz57 xt0e3qv"><span><span>yeah yeah yeah</span></span></div></div></div><div class=""></div></div> <img alt="Gesehen von Manuel Marchie – 14:41" class="x6umtig x1b1mbwd xaqea5y xav7gou x14yjl9h xudhj91 x18nykt9 xww2gxu xjpr12u x10l6tqk xlftelb img" title="Gesehen von Manuel Marchie – 14:41" src="https://scontent-vie1-1.xx.fbcdn.net/v/t1.30497-1/84628273_176159830277856_972693363922829312_n.jpg?stp=c59.0.200.200a_dst-jpg_p200x200&_nc_cat=1&ccb=1-7&_nc_sid=12b3be&_nc_ohc=O7CR_V32jMkAX-d2qoC&_nc_ht=scontent-vie1-1.xx&oh=00_AfCWMM9EsteVjxrm3mKJ4Qo-tRDbpMOHRYyY53yuob1TWQ&oe=64D74E19" width="15" height="15"> </div><div class="xeuugli x2lwn1j x78zum5 x1nhvcw1"></div>
我的尝试(未成功)
messages : list[str] = [] for message_block in message_blocks: messages.append(message_block.find_element(By.CLASS_NAME, "(don't now what comes here)"))
解决方案
Facebook的动态类名频繁变动,直接依赖类名定位容易失效,推荐以下几种可行方法:
方法1:精准定位文本所在元素
通过XPath直接定位包含文本的嵌套元素:
messages = [] for message_block in message_blocks: text_elem = message_block.find_element(By.XPATH, ".//div[@class='x1y1aw1k xn6708d xwib8y2 x1ye3gou x13faqbe x1eied1y xca6lcq x1pdtjp8 xpctjk2 xogfrqt x1slwz57 xt0e3qv']/span/span") messages.append(text_elem.text)
方法2:简化层级定位
如果类名仍不稳定,可通过DOM层级关系定位,避免依赖完整类名:
messages = [] for message_block in message_blocks: # 定位消息块内第二个div分支下的最内层span text_elem = message_block.find_element(By.XPATH, ".//div[2]//span[last()]") messages.append(text_elem.text)
方法3:提取并过滤纯文本
直接获取消息块的全部文本,再过滤掉头像名称、已读提示等冗余内容:
messages = [] for message_block in message_blocks: full_text = message_block.text # 过滤已知冗余内容,提取核心消息文本 message_text = [line for line in full_text.split('\n') if line not in ["Manuel Marchie", "Gesehen von Manuel Marchie – 14:41"]][0] messages.append(message_text)
内容的提问来源于stack exchange,提问作者Olmiϟ
相关产品推荐
相关产品推荐

