核心区别在于输入来源和返回对象类型:fromstring() 从字符串解析,返回 Element 对象;parse() 从文件或类文件对象解析,返回 ElementTree 对象。
核心区别在于输入来源和返回对象类型:`fromstring()` 从字符串解析,返回 Element 对象;`parse()` 从文件或类文件对象解析,返回 ElementTree 对象。
两者设计初衷就针对不同数据源:
fromstring(text):只接受**字符串**(如 HTML/XML 片段、响应文本 response.text),适合网络请求后直接解析内容parse(source):接受**文件路径字符串**(如 "data.xml")或**类文件对象**(如 open("file.html")、io.BytesIO(data)),适合读取本地文件或二进制流这直接影响后续操作能力:
fromstring() 返回 Element —— 表示 XML/HTML 文档的根节点,可查子节点、属性、文本,但不支持直接写入文件或序列化整棵树
parse() 返回 ElementTree —— 封装整个文档结构,提供 .write() 方法,能保存修改后的完整文档到文件或字节流虽然都可传入自定义 parser= 参数,但默认行为有细节差别:
fromstring() 默认用 etree.XMLParser()(严格 XML 模式),若解析 HTML 建议显式用 etree.HTMLParser() 或改用 etree.HTML()
parse() 同样默认 XML 解析器,但对文件读取时会更早触发编码检测(尤其配合 HTMLParser 时,对乱码页面容错略好)etree.HTML(text)(等价于 fromstring(text, parser=HTMLParser()))比 fromstring() 更稳妥看你的数据在哪、要做什么:
str 或 bytes(比如 requests.get().text),且只需提取数据 → 用 fromstring() 或 HTML()
parse()
parse() 得到 ElementTree,再调用 .getroot() 获取根 Element 操作