pyquery本质是css选择器驱动的html解析器,非jquery移植,不支持动画或事件;html()仅返首元素html字符串(空则none),text()返所有匹配元素纯文本合并串(空则'')。

PyQuery 本质是 CSS 选择器驱动的 HTML 解析器,不是真正的 jQuery 移植,别指望它支持 .animate() 或事件绑定 —— 它只做解析和简单 DOM 操作。
为什么 PyQuery 的 html() 和 text() 行为容易混淆
这两个方法返回值类型不同,且对嵌套结构处理逻辑相反:
-
html()返回子节点的完整 HTML 字符串(含标签),但只取第一个匹配元素的内容;多次调用不会自动拼接所有匹配项 -
text()返回所有匹配元素的纯文本内容合并后的字符串(空格分隔),不保留结构,也不含标签 - 如果目标元素为空(比如
<div></div>),html()返回None,而text()返回空字符串'' - 想批量提取多个元素的 HTML?得用列表推导:
[item.html() for item in pq('li')]
用 attr() 和 val() 读取属性时的典型陷阱
PyQuery 对表单控件的值获取有隐式优先级,val() 不是简单读 value 属性:
-
attr('value')读的是 HTML 中写死的value="xxx"属性,哪怕用户已修改输入框内容也不会变 -
val()读的是当前实际值(对<input>、<textarea></textarea>、<select></select>有效),类似浏览器 DOM 的element.value - 对非表单元素(如
<div data-id="123">)调用 <code>val()会返回None,必须用attr('data-id') - 设置属性统一用
attr('name', 'new'),但设表单值推荐val('new'),更语义清晰 - 原始 HTML 没被正确加载:确认
pq(html_string)或pq(url=...)返回对象非空,打印len(pq_obj)看是否为 0 - CSS 选择器语法错误:PyQuery 不支持
:nth-of-type(2n)这类复杂伪类,只支持基础选择器(.class、#id、div p、input[type="text"]) - HTML 被浏览器“修正”过:服务端返回的 HTML 若有未闭合标签(如
<p>hello</p> <p>world</p>),PyQuery 解析后结构可能和你预期不同;可用pq_obj.outerHtml()打印实际解析结果对比 - 动态内容?PyQuery 不执行 JS,
find()找不到 AJAX 渲染后的节点 —— 这时候得换requests + selenium或playwright
当 find() 不生效,先检查这三件事
PyQuery 的 find() 是深度优先查找,但常见失效原因和 jQuery 一致,只是报错更安静:
真正麻烦的是混合了命名空间的 XML/HTML(比如带 svg 或 mathml 的页面),PyQuery 默认忽略命名空间前缀,find('svg path') 可能完全不匹配 —— 这种情况得切回 lxml.etree 手动处理。











