


虽然同目录下面有这个ceshi.html文件,但是按照书中的代码写是会报错的。

将代码使用with语句,转换为utf-8就可以正常解析了,如下:

pq是PyQuery类的别名,pq(html_content)本质上是调用PyQuery类的构造方法,创建并返回一个PyQuery类的实例。
doc作为实例,拥有PyQuery类定义的所有方法(如.find()、.text()、.attr()、.items()等),这也是你能执行doc('.list li')的原因。
**因为PyQuery类实现了 Python 的 **__call__魔法方法 。
__call__方法的作用当一个类实现了__call__方法,它的实例就可以像函数一样被调用。PyQuery的__call__方法被设计为接收 CSS 选择器,返回匹配的新 PyQuery 实例,这也是doc('.list li')能生效的核心原理。
举个简化的例子,模拟PyQuery的__call__实现:
class MyPyQuery:
def __init__(self, html):
self.html = html # 存储HTML内容
def __call__(self, selector):
# 模拟根据选择器匹配元素的逻辑
print(f"根据选择器 {selector} 匹配元素")
return self # 实际PyQuery会返回新的实例
# 创建实例
my_doc = MyPyQuery('<div class="list"><li>测试</li></div>')
# 实例像函数一样被调用(因为实现了__call__)
my_doc('.list li') # 输出:根据选择器 .list li 匹配元素
因此,doc('.list li')并不是因为doc是函数,而是doc作为PyQuery实例,通过__call__方法支持了 “调用” 语法。
