You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无类名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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 17:09:01