鱼C论坛

 找回密码
 立即注册
查看: 942|回复: 12

python中使用pyquery获取属性的问题

[复制链接]
发表于 2024-2-6 16:48:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码如下:

import requests
from pyquery import PyQuery
headers ={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"
}
request = requests.get("https://movie.douban.com/top250?start=0&filter=",headers=headers)  # 函数赋值
result = request.text
doc = PyQuery(result)
a = doc(".item .pic img")
c = a.attr("alt")
print(c)



我想获取页面上所有的类选择器item 下面类选择器pic 下 img标签,img标签中的所有alt属性,该怎么写呢?
上述代码只能获取到第一个值,也就是  肖申克的救赎, 然后我大致看了一下网页的结构,属性alt的结构都是一致的,为什么只能获取到第一个alt属性的值呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-2-6 16:48:47 | 显示全部楼层
你好,对于PyQuery库来说,当你使用`.attr("属性名")`方法时,它只会返回匹配到的第一个元素的属性值,不会返回所有匹配到的元素的属性值。

要获取页面上所有的类选择器`.item`下面类选择器`.pic`下的`img`标签中的所有`alt`属性,可以使用`.items()`方法遍历所有匹配到的元素,然后分别获取它们的`alt`属性。代码如下:
import requests
from pyquery import PyQuery

headers ={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"
}
request = requests.get("https://movie.douban.com/top250?start=0&filter=",headers=headers)
result = request.text
doc = PyQuery(result)
a_list = doc(".item .pic img").items()  # 获取所有匹配到的元素
for a in a_list:
    c = a.attr("alt")  # 获取每个元素的alt属性
    print(c)

这样就能够打印出所有匹配到的`img`标签的`alt`属性值了。希望对你有帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-6 16:58:04 | 显示全部楼层
FishC 发表于 2024-2-6 16:48
你好,对于PyQuery库来说,当你使用`.attr("属性名")`方法时,它只会返回匹配到的第一个元素的属性值,不会 ...
doc = PyQuery(result)
a = doc(".item .pic img")
c = a.attr("alt").items()
for i in c:
    print(i)

为什么这样写报错了呢?

AttributeError: 'str' object has no attribute 'items'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-6 16:58:17 | 显示全部楼层
python小小白哟 发表于 2024-02-06 16:58
doc = PyQuery(result)
a = doc(".item .pic img")
...


抱歉,这是因为`.attr("alt")`返回的是一个字符串,而字符串对象没有`items()`方法。要获取所有匹配到的元素属性值,可以直接通过`a`对象进行遍历并打印出来。代码如下所示:import requestsfrom pyquery import PyQueryheaders ={    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"}request = requests.get("https://movie.douban.com/top250?start=0&filter=",headers=headers)result = request.textdoc = PyQuery(result)a = doc(".item .pic img")for img in a:    c = img.attrib["alt"]  # 获取每个元素的alt属性    print(c)这样,就可以打印出所有匹配到的`img`标签的`alt`属性值了。希望这次能够解决你的问题!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-6 17:03:09 | 显示全部楼层
来个人吧   AI回答的不是太明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-6 17:03:22 | 显示全部楼层
python小小白哟 发表于 2024-02-06 17:03
来个人吧   AI回答的不是太明白


当使用`PyQuery`的`.attr("属性名")`方法时,它只会返回匹配到的第一个元素的属性值,不能获取所有匹配到的元素的属性值。要获取所有匹配到的元素的属性值,可以使用`.items()`方法来遍历匹配到的元素,并分别获取它们的属性值。

在你的代码中,`a = doc(".item .pic img")` 返回的是一个字符串对象,而字符串对象没有`items()`方法,因此出现了错误`AttributeError: 'str' object has no attribute 'items'`。

为了解决这个问题,你可以通过直接遍历选择器来获取每个匹配到的元素的属性值。代码如下:
import requests
from pyquery import PyQuery

headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"
}

request = requests.get("https://movie.douban.com/top250?start=0&filter=", headers=headers)
result = request.text
doc = PyQuery(result)

a = doc(".item .pic img")

for item in a:
    c = PyQuery(item).attr("alt")
    print(c)

这样就能够打印出所有匹配到的`img`标签的`alt`属性值了。每次循环取出的`item`都是一个 `PyQuery` 对象,可以通过`.attr("属性名")`方法获取其属性值。

希望这次能够解决你的问题!如果还有其他疑问,请随时提出。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-6 17:05:35 | 显示全部楼层
FishC 发表于 2024-2-6 17:03
当使用`PyQuery`的`.attr("属性名")`方法时,它只会返回匹配到的第一个元素的属性值,不能获取所有匹配 ...

大致有点明白了,是不是把获取到的内容存储到items中,然后遍历一下,获取属性的值呢?是这个意思吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-6 17:05:44 | 显示全部楼层
python小小白哟 发表于 2024-02-06 17:05
大致有点明白了,是不是把获取到的内容存储到items中 ...


对的,你理解得很正确!通过 `doc(".item .pic img")` 选择器获取到的匹配元素会存储在一个 `items` 对象中,可以使用 `.items()` 方法将其转为可遍历的对象。然后你可以遍历这个对象,在每次循环中使用 `PyQuery(item)` 将每个元素转换为 `PyQuery` 对象,进而可以使用 `.attr("属性名")` 方法获取其属性值。这样就可以依次获取到每个匹配元素的属性值了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-6 17:07:29 | 显示全部楼层
pyquery没研究过,抱歉解决不了这个问题
但lxml应该可以解决你的需求,也很好上手,很强大
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-6 17:08:34 | 显示全部楼层
青出于蓝 发表于 2024-2-6 17:07
pyquery没研究过,抱歉解决不了这个问题
但lxml应该可以解决你的需求,也很好上手,很强大

你好  版主大大      最近在研究pyquery,所以希望用pyquery解决上述问题。

点评

我很赞同!: 5.0
我很赞同!: 5
  发表于 2024-2-6 17:25
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-6 19:02:42 | 显示全部楼层
本帖最后由 阿奇_o 于 2024-2-6 19:05 编辑

CSS选择器,会用的话,就这样。。a piece of code 。。
for i in range(1, 26):
        selector = f"#content > div > div.article > ol > li:nth-child({i}) > div > div.pic > a > img"
        item = doc(selector)
        print(item.attr('alt'), item.attr('src'))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-7 08:53:53 | 显示全部楼层
青出于蓝 发表于 2024-2-6 17:07
pyquery没研究过,抱歉解决不了这个问题
但lxml应该可以解决你的需求,也很好上手,很强大
import requests
from pyquery import PyQuery
headers ={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"
}
request = requests.get("https://movie.douban.com/top250?start=0&filter=",headers=headers)  # 函数赋值
result = request.text
doc = PyQuery(result)
a = doc(".item .pic").remove("em")
cc = PyQuery(a)
dd = cc(".pic a img").items()
for i in dd:
    print(i.attr("alt"))

解决掉了  上述代码 使用pyquery完美提取内容。

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +3 收起 理由
青出于蓝 + 3 + 3 + 3 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 03:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表