BeautifulSoup中如何通过CSS选择器精准提取目标文本
问题原因
你当前使用的CSS选择器匹配范围过宽,选中了酒店信息卡片中包含评分、距地标距离、优惠标签等多类信息的父级容器,因此会输出该容器下所有子节点的混合文本。同时原有代码未携带合法请求头,很容易被网站反爬机制拦截,返回无效的页面内容。
修改方法
- 给requests请求添加标准浏览器的User-Agent请求头,绕过基础反爬校验,拿到完整的有效页面DOM
- 替换原有依赖层级位置的nth-child选择器,改用页面中专门标记地点元素的
data-testid="location"属性做精准定位,这类测试属性一般不会随页面样式调整变动,定位准确率远高于层级选择器
修改后完整代码
import pandas as pd from bs4 import BeautifulSoup as bs import requests url = "https://www.hotels.com/Hotel-Search?adults=2&d1=2022-07-01&d2=2022-07-02&destination=Georgia&endDate=2022-07-02&latLong=42.211058611965235%2C43.30777377386527®ionId=11403&rooms=1&semdtl=&sort=RECOMMENDED&startDate=2022-07-01&theme=&useRewards=false&userIntent=" # 携带合法浏览器标识请求头 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" } soup = bs(requests.get(url, headers=headers).content, "html.parser") # 精准匹配地点元素 locations = soup.select('[data-testid="location"]') for location in locations: # 去除文本前后多余空白字符后输出 print(location.text.strip())
补充说明:如果后续网站前端迭代导致
data-testid属性失效,可以打开浏览器开发者工具定位显示地点的DOM节点,替换为节点上的稳定属性选择器即可,尽量避免使用多层嵌套+nth-child的选择器写法,这类写法只要页面某一层级结构调整就会完全失效。
内容的提问来源于stack exchange,提问作者beridzeg45
相关产品推荐
相关产品推荐

