Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Can';t使用getattr()函数解析bs4 src属性_Python_Python 3.x_Web Scraping_Getattr - Fatal编程技术网

Python Can';t使用getattr()函数解析bs4 src属性

Python Can';t使用getattr()函数解析bs4 src属性,python,python-3.x,web-scraping,getattr,Python,Python 3.x,Web Scraping,Getattr,我创建了一个脚本来解析网页中每个电影容器的两个字段。剧本写得很好 我正试图使用这个getattr()函数从两个字段中刮取文本和src,如movie\u name和image\u link中。如果是movie\u name,它会工作。但是,当我尝试解析图像链接时,它失败了 当前有一个函数被注释掉了,当我取消注释时,它可以工作。然而,我的目标是利用getattr()来解析src import requests from bs4 import BeautifulSoup url = "ht

我创建了一个脚本来解析网页中每个电影容器的两个字段。剧本写得很好

我正试图使用这个
getattr()
函数从两个字段中刮取文本和src,如
movie\u name
image\u link
中。如果是
movie\u name
,它会工作。但是,当我尝试解析
图像链接时,它失败了

当前有一个函数被注释掉了,当我取消注释时,它可以工作。然而,我的目标是利用
getattr()
来解析
src

import requests
from bs4 import BeautifulSoup

url = "https://yts.am/browse-movies"
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'
}

# def get_information(url):
#     res = requests.get(url,headers=headers)
#     soup = BeautifulSoup(res.text,'lxml')
#     for row in soup.select(".browse-movie-wrap"):
#         movie_name = row.select_one("a.browse-movie-title").text
#         image_link = row.select_one("img.img-responsive").get("src")
#         yield movie_name,image_link

def get_information(url):
    res = requests.get(url,headers=headers)
    soup = BeautifulSoup(res.text,'lxml')
    for row in soup.select(".browse-movie-wrap"):
        movie_name = getattr(row.select_one("a.browse-movie-title"),"text",None)
        image_link = getattr(row.select_one("img.img-responsive"),"src",None)
        yield movie_name,image_link

if __name__ == '__main__':
    for items in get_information(url):
        print(items)
如何使用
getattr()
函数刮取
src

这一做法奏效的原因是:

movie_name = getattr(row.select_one("a.browse-movie-title"),"text",None)
但这并不是:

image_link = getattr(row.select_one("img.img-responsive"),"src",None)
这是因为类的方法也是属性。因此,在第一个示例中,您实际上是在获取函数text。换句话说,没有名为
src
的方法或属性

import requests
from bs4 import BeautifulSoup

url = "https://yts.am/browse-movies"
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'
}

# def get_information(url):
#     res = requests.get(url,headers=headers)
#     soup = BeautifulSoup(res.text,'lxml')
#     for row in soup.select(".browse-movie-wrap"):
#         movie_name = row.select_one("a.browse-movie-title").text
#         image_link = row.select_one("img.img-responsive").get("src")
#         yield movie_name,image_link

def get_information(url):
    res = requests.get(url,headers=headers)
    soup = BeautifulSoup(res.text,'lxml')
    for row in soup.select(".browse-movie-wrap"):
        movie_name = getattr(row.select_one("a.browse-movie-title"),"text",None)
        image_link = getattr(row.select_one("img.img-responsive"),"src",None)
        yield movie_name,image_link

if __name__ == '__main__':
    for items in get_information(url):
        print(items)
如果查看以下属性的
属性

row.select_one("a.browse-movie-title").attrs
您将获得:

{'href': 'https://yts.mx/movies/imperial-blue-2019', 'class': ['browse-movie-title']}
同样,对于

row.select_one(".img-responsive").attrs
输出为:

{'class': ['img-responsive'], 'src': 'https://img.yts.mx/assets/images/movies/imperial_blue_2019/medium-cover.jpg', 'alt': 'Imperial Blue (2019) download', 'width': '170', 'height': '255'}
因此,如果我们进行实验并做到这一点:

getattr(row.select_one(".img-responsive"), "attrs", None).src
我们将以以下方式结束:

AttributeError: 'dict' object has no attribute 'src'
因此,正如注释中提到的,这不是在
bs4
对象上使用纯Python意义上的
getattr()
的方式。您可以使用
.get()
方法或
[key]
语法

例如:

import requests
from bs4 import BeautifulSoup

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'
}


def get_information(url):
    soup = BeautifulSoup(requests.get(url, headers=headers).text, 'lxml')
    for row in soup.select(".browse-movie-wrap"):
        movie_name = row.select_one("a.browse-movie-title").getText()
        image_link = row.select_one("img.img-responsive").get("src")
        yield movie_name, image_link


if __name__ == '__main__':
    for items in get_information("https://yts.am/browse-movies"):
        print(items)
这将产生:

('Imperial Blue', 'https://img.yts.mx/assets/images/movies/imperial_blue_2019/medium-cover.jpg')
('Ablaze', 'https://img.yts.mx/assets/images/movies/ablaze_2001/medium-cover.jpg')
('[CN] Long feng zhi duo xing', 'https://img.yts.mx/assets/images/movies/long_feng_zhi_duo_xing_1984/medium-cover.jpg')
('Bobbie Jo and the Outlaw', 'https://img.yts.mx/assets/images/movies/bobbie_jo_and_the_outlaw_1976/medium-cover.jpg')
('Adam Resurrected', 'https://img.yts.mx/assets/images/movies/adam_resurrected_2008/medium-cover.jpg')
('[ZH] The Wasted Times', 'https://img.yts.mx/assets/images/movies/the_wasted_times_2016/medium-cover.jpg')
('Promise', 'https://img.yts.mx/assets/images/movies/promise_2021/medium-cover.jpg')

and so on ...
最后,如果您真的想用
getattr()
解析它,您可以尝试以下方法:

movie_name = getattr(row.select_one("a.browse-movie-title"), "getText", None)()
image_link = getattr(row.select_one("img.img-responsive"), "attrs", None)["src"]
您仍然会得到相同的结果,但是,我想,这比普通的
.getText()
.get(“src”)
语法复杂得多,可读性也不强。

“src”不是Python意义上的
select\u one
输出的属性。您需要使用
get
方法获取标记的属性(在单词的HTML意义上)。