无类名li标签如何精准抓取?不同页面列表项顺序不统一怎么办
不定序无序列表指定字段抓取方案
核心思路
你要抓取的列表结构中,每个li下的第一个字段标识span的文本固定,后续节点为对应字段值,因此可以通过匹配标识文本定位目标li,完全不受li排序影响。
具体实现
通用XPath方案(适配所有支持XPath的爬虫工具)
直接通过字段名匹配定位取值:
- 提取联系人:
//ul[contains(@class,"main-contacts")]/li[./span[1][text()="Contact person"]]/span[2]/text() - 提取注册日期:
//ul[contains(@class,"main-contacts")]/li[./span[1][text()="Registered on"]]/span[2]/text() - 提取电话号码:
//ul[contains(@class,"main-contacts")]/li[./span[1][text()="Phone"]]//span[@itemprop="telephone"]/text()
Python BeautifulSoup 方案
可以把所有字段先整理成字典,后续取值更方便:
from bs4 import BeautifulSoup # page_html为你获取到的页面源码字符串 soup = BeautifulSoup(page_html, "lxml") # 先定位目标ul contact_ul = soup.find("ul", class_="c-list main-contacts") contact_info = {} for li in contact_ul.find_all("li"): spans = li.find_all("span") if not spans: continue # 取第一个span的文本作为字段key field_key = spans[0].text.strip() if field_key == "Phone": # 电话号码结构特殊,单独处理 field_val = li.find("span", itemprop="telephone").text.strip() else: # 其他字段直接取第二个span的文本 field_val = spans[1].text.strip() contact_info[field_key] = field_val # 直接通过key取值,不受li顺序影响 contact_person = contact_info.get("Contact person") registered_date = contact_info.get("Registered on") phone = contact_info.get("Phone")
方案优势
只要页面的字段标识文本不变,不管li顺序调整、新增/删除其他列表项,都不会影响目标字段的提取准确率,鲁棒性远高于按索引取值的方案。
内容的提问来源于stack exchange,提问作者user17087759
相关产品推荐
相关产品推荐

