python小小白哟 发表于 2024-2-6 16:48:31

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

代码如下:


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属性的值呢?

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

python小小白哟 发表于 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'

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

python小小白哟 发表于 2024-2-6 17:03:09

来个人吧   AI回答的不是太明白

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

python小小白哟 发表于 2024-2-6 17:05:35

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

大致有点明白了,是不是把获取到的内容存储到items中,然后遍历一下,获取属性的值呢?是这个意思吗?

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

青出于蓝 发表于 2024-2-6 17:07:29

pyquery没研究过,抱歉解决不了这个问题
但lxml应该可以解决你的需求,也很好上手,很强大

python小小白哟 发表于 2024-2-6 17:08:34

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

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

阿奇_o 发表于 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'))

python小小白哟 发表于 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]
查看完整版本: python中使用pyquery获取属性的问题