python - 如何处理 InvalidSchema 异常
问题描述
我在 python 中使用其中的两个函数编写了一个脚本。第一个函数get_links()
从网页中获取一些链接并将这些链接返回给另一个函数get_info()
。此时,该函数get_info()
应该从不同的链接生成不同的商店名称,但它会引发错误raise InvalidSchema("No connection adapters were found for '%s'" % url)
。
这是我的尝试:
import requests
from urllib.parse import urljoin
from bs4 import BeautifulSoup
def get_links(url):
response = requests.get(url)
soup = BeautifulSoup(response.text,"lxml")
elem = soup.select(".info h2 a[data-analytics]")
return get_info(elem)
def get_info(url):
response = requests.get(url)
print(response.url)
soup = BeautifulSoup(response.text,"lxml")
return soup.select_one("#main-header .sales-info h1").get_text(strip=True)
if __name__ == '__main__':
link = 'https://www.yellowpages.com/search?search_terms=%20Injury%20Law%20Attorneys&geo_location_terms=California&page=2'
for review in get_links(link):
print(urljoin(link,review.get("href")))
我在这里尝试学习的关键是现实生活中的用法return get_info(elem)
我为此创建了另一个线程return get_info(elem)
。链接到那个线程。
当我尝试以下操作时,我会得到相应的结果:
def get_links(url):
response = requests.get(url)
soup = BeautifulSoup(response.text,"lxml")
elem = soup.select(".info h2 a[data-analytics]")
return elem
def get_info(url):
response = requests.get(url)
soup = BeautifulSoup(response.text,"lxml")
return soup.select_one("#main-header .sales-info h1").get_text(strip=True)
if __name__ == '__main__':
link = 'https://www.yellowpages.com/search?search_terms=%20Injury%20Law%20Attorneys&geo_location_terms=California&page=2'
for review in get_links(link):
print(get_info(urljoin(link,review.get("href"))))
我的问题:如何根据我尝试使用我的第一个脚本的方式获得结果return get_info(elem)
?
解决方案
检查每个函数返回的内容。在这种情况下,您的第一个脚本中的函数将永远不会运行。原因是get_info
接受一个 URL,而不是其他任何东西。所以很明显,当您运行get_info(elem)
where elem
is a list of items that are selected by时,您会遇到错误soup.select()
。
您应该已经知道上述内容,因为您正在迭代第二个脚本的结果,该脚本仅返回列表以获取href
元素。因此,如果您想get_info
在您的第一个脚本中使用它,将其应用于项目而不是列表,您可以在这种情况下使用列表推导。
import requests
from urllib.parse import urljoin
from bs4 import BeautifulSoup
def get_links(url):
response = requests.get(url)
soup = BeautifulSoup(response.text,"lxml")
elem = soup.select(".info h2 a[data-analytics]")
return [get_info(urljoin(link,e.get("href"))) for e in elem]
def get_info(url):
response = requests.get(url)
soup = BeautifulSoup(response.text,"lxml")
return soup.select_one("#main-header .sales-info h1").get_text(strip=True)
link = 'https://www.yellowpages.com/search?search_terms=%20Injury%20Law%20Attorneys&geo_location_terms=California&page=2'
for review in get_links(link):
print(review)
现在你知道第一个函数仍然返回一个列表,但get_info
应用到它的元素上,它是如何工作的?get_info
接受 URL 而不是列表。从那里开始,因为您已经应用了url_join
and get_info
in get_links
,您可以循环它来打印结果。
推荐阅读
- python-3.x - 交互式经纪商 API 客户端 /Python 将 LMT 价格设置为当前价格
- php - 我想使用 codeigniter 上传多个文件
- angular - 当收到新消息而不重新加载视图时,如何将来自 stomp 客户端的消息显示到视图中
- firebase - 在 Travis CI 运行期间 Firebase 不接受令牌
- python-3.x - scipy.misc.imresize() 的替代方案
- javascript - 当我使用鼠标单击时,我的 onClick 功能正在工作,但是当我使用键盘时,它不起作用。任何建议如何解决?
- c# - 你可以分层 TableLayoutPanels 吗?
- php - "锁定"是什么意思
运行“作曲家更新”时的意思 “? - c# - axios发布后如何使用模型重定向到另一个mvc视图
- reactjs - 如何使徽章出现在 Material UI 中的卡片标题旁边