我有两个变量,一个包含绝对URL,另一个包含另一个部分的相对路径。首先,我尝试了一个简单的连接。
absolute_url = www.example.com
relative_url = /downloads/images
url = absolute_url + relative_url
当我打印url变量时,我有一个格式正确的URL。但是当我尝试使用请求或urllib2来检索数据时,大约有一半的时间会抛出异常:' NoneType'对象没有属性' getitem '
然后我研究并认为也许我应该使用urllib.urlparse.urljoin()来做到这一点,但我仍然得到错误。
但令我感到有趣的是,有时候它有效,有时候不会。关于这里发生了什么的任何想法?
修改
以下是实际代码:
url = "http://www.hdwallpapers.in"
html = requests.get(url)
soup = BeautifulSoup(html.text)
categories = ("Nature", "Animals & Birds", "Beach", "Bikes", "Cars","Dreamy & Fantasy", "Others", "Travel & World")
random_category = random.randint(0, len(categories)) - 1
selected_category = categories[random_category]
selected_category_url = soup.find('a', text=selected_category)
category_page_url_join = urlparse.urljoin(url, selected_category_url['href'])
category_page_html = requests.get(category_page_url_join)
答案 0 :(得分:1)
您有一个categories
的列表:
categories = ("Nature", "Animals & Birds", "Beach", "Bikes", "Cars","Dreamy & Fantasy", "Others", "Travel & World")
然后你随机挑选一个并搜索它:
random_category = random.randint(0, len(categories)) - 1
selected_category = categories[random_category]
selected_category_url = soup.find('a', text=selected_category)
这将更容易编写,并且可读如下:
selected_category_url = soup.find('a', text=random.choice(categories))
现在你的问题无疑来自:
category_page_url_join = urlparse.urljoin(url, selected_category_url['href'])
这意味着您的selected_category_url
结束了None
,因为您soup.find
实际上找不到任何内容。因此,实际上您正在尝试运行None['href']
(当然会失败......)
请注意,requests
不会进行任何HTML实体转义,但BeautifulSoup
会尽力尝试,例如:
from bs4 import BeautifulSoup
soup1 = BeautifulSoup('smith & jones')
soup2 = BeautifulSoup('smith & jones')
soup1, soup2
(<html><body><p>smith & jones</p></body></html>,
<html><body><p>smith & jones</p></body></html>)
所以,既然你说&#34;大约一半的时间&#34;然后是因为你有3个选择,你正在寻找那场不匹配....尝试用你的&
取代categories
{ {1}}而不是。