影刀RPA Python BeautifulSoup网页解析完全指南比XPath更灵活作者林焱影刀自带的数据提取工具有两个可视化捕获点选元素和XPath。这两个够应付80%的场景但遇到以下情况就捉襟见肘了网页HTML结构混乱同一个数据在不同页面的位置不一样需要提取的数据没有唯一标识属性需要同时处理多个条件比如找所有class包含title但不是广告的div这时候BeautifulSoup上场。它是Python最受欢迎的HTML解析库灵活度远超XPath。BeautifulSoup的核心逻辑先记住BeautifulSoup的数据流HTML字符串 → BeautifulSoup解析 → soup对象 → 用选择器找到目标 → 提取文本/属性在影刀的Python代码块中你可以直接传入影刀获取到的网页源码frombs4importBeautifulSoup# html_str是从影刀的获取网页源码指令拿到的HTMLsoupBeautifulSoup(html_str,html.parser)# 找到所有的标题[video(video-TnymeX83-1783622023150)(type-csdn)(url-https://live.csdn.net/v/embed/525010)(image-https://v-blog.csdnimg.cn/asset/f4faa587144cb7070f19e8b36813806b/cover/Cover0.jpg)(title-店群矩阵自动化突破运营极限)]titlessoup.find_all(h3,class_title)fortintitles:print(t.text.strip())五种常用查找方式1. find / find_all —— 找标签# 找第一个divdivsoup.find(div)# 找所有a标签linkssoup.find_all(a)# 按属性找class为price的spanpricessoup.find_all(span,class_price)# 按id找mainsoup.find(div,idmain-content)2. select —— CSS选择器如果你会CSS选择器#id、.class、子元素这个最顺手# 找到所有.product下的.pricepricessoup.select(.product .price)# 找到tr下的第一个tdcellssoup.select(tr td:first-child)# 找属性选择器itemssoup.select(div[data-typegoods])3. 提取文本和属性elemsoup.find(a,class_link)textelem.text# 标签内的文本hrefelem.get(href)# href属性的值srcelem.get(src)# img标签的src4. 遍历兄弟节点和父子关系这是XPath最弱但BeautifulSoup最强的地方currentsoup.find(h2,text商品详情)next_divcurrent.find_next(div)# 下一个兄弟parentcurrent.parent# 父节点childrencurrent.parent.find_all(div)# 父节点下所有div5. 条件筛选# 找所有class包含title但不包含ad的元素itemssoup.find_all(div,class_lambdac:candtitleincandadnotinc)# 找文本包含价格的spanprice_labelssoup.find_all(span,textlambdat:tand价格int)实战混合使用影刀捕获 BeautifulSoup解析最佳实践是用影刀做粗的定位找到数据所在的大区域用BeautifulSoup做细的提取。比如一个商品列表页每个商品卡片结构略有差异。用影刀的XPath可能某些卡片匹配不到但你用影刀先把整个列表区域的HTML拿到然后丢给BeautifulSoup# 影刀拿到列表区域的outerHTMLhtml_fragment!-- 影刀获取到的HTML片段 --soupBeautifulSoup(html_fragment,html.parser)results[]cardssoup.find_all(div,class_goods-card)forcardincards:namecard.find(h4,class_name)pricecard.find(span,class_price)results.append({name:name.text.strip()ifnameelse,price:price.text.strip()ifpriceelseN/A})注意每个find后面都加了if判断——这才是生产级代码。结构不一致的页面总会有某个元素不存在不加判断直接.text就报错。踩坑实录坑1安装了bs4但import报错temu店群自动化报活动案例pip install beautifulsoup4之后import时写from bs4 import BeautifulSoup不是from beautifulsoup4 import ...。很多新手在这里卡半天。坑2文本里有大量的空白字符直接.text拿到的东西经常前后有换行符、空格。一定要加.strip()。如果中间有多余空白用.get_text(stripTrue)clean_textelem.get_text(stripTrue)坑3用text参数匹配不到find_all(a, text下一页)这种精确匹配经常会因为文本前后有空格而失败。改用lambda或者用string参数# 模糊匹配soup.find(a,textlambdat:tand下一页int)# 或者用string参数完全匹配但忽略空白soup.find(a,stringlambdas:sands.strip()下一页)坑4把Tag对象当字符串用BeautifulSoup返回的是Tag对象不是字符串。print(elem)会自动转成HTML但你想要的是文本或者属性。新手经常写着item[name]想拿属性结果发现item是Tag对象属性得用item.get(name)或item[name]。写在最后影刀的可视化捕获和XPath是快刀BeautifulSoup是手术刀。日常采集用快刀就够了数据量一大、结构一乱换手术刀。关键不是学多少工具而是知道每个工具的适用边界。