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意义上)。