来自在线python课程: 您将获得一个包含100个名字的网站。所有名称都以链接的形式出现。每个链接指向另外100个链接。您必须使用python选择第7个链接7次,然后打印出结果。 我的代码到目前为止:
$key_count = 0;
foreach ($result['items_to_receive'] as $item ) {
if ( stripos( $item['name'], 'key' ) ) {
$key_count++;
}
}
它不起作用。它不断给我相同的链接...
这是输出:
z = 0
atags = []
listurl = []
#import modules
import urllib
from bs4 import BeautifulSoup
import re
newurl = "https://pr4e.dr-chuck.com/tsugi/mod/python-data/data/known_by_Desmond.html"
while z < 7:
url = newurl
z = z + 1
html = urllib.urlopen(url).read()
soup = BeautifulSoup(html)
soup.find_all("url")
a = soup.find_all('a')
for x in a:
atags.append(str(x))
url_end_full = atags[19]
url_end = re.findall(r'"(.*?)"', url_end_full)
url_end = str(url_end[0])
newurl = 'https://pr4e.dr-chuck.com/tsugi/mod/python-data/data/' + url_end
str(newurl)
listurl.append(newurl)
url = newurl
print url
当我将答案输入答案框时,答案是错误的。
答案 0 :(得分:1)
有几个问题。
atags[19]
不是第18项,它是第20项(lst[0]
是列表中的第一项)。
soup.find_all("url")
什么都不做;摆脱它。
您不需要re
。
返回的链接是相对的;你正在对基本路径进行硬连接以使它们成为绝对路径。 在这种情况下它起作用,但这是运气问题;使用urljoin
。
虽然str(link)
确实为您提供了网址,但&#34;正确的&#34;方法是通过索引属性,即link['href']
。
通过一些明智的清理,
from bs4 import BeautifulSoup
import sys
# version compatibility shim
if sys.hexversion < 0x3000000:
# Python 2.x
from urlparse import urljoin
from urllib import urlopen
else:
# Python 3.x
from urllib.parse import urljoin
from urllib.request import urlopen
START_URL = "https://pr4e.dr-chuck.com/tsugi/mod/python-data/data/known_by_Desmond.html"
STEPS = 7
ITEM = 18
def get_soup(url):
with urlopen(url) as page:
return BeautifulSoup(page.read(), 'lxml')
def main():
url = START_URL
for step in range(STEPS):
print("\nStep {}: looking at '{}'".format(step, url))
# get the right item (Python arrays start indexing at 0)
links = get_soup(url).find_all("a")
rel_url = links[ITEM - 1]["href"]
# convert from relative to absolute url
url = urljoin(url, rel_url)
print(" go to '{}'".format(url))
if __name__=="__main__":
main()
如果我做得对,那么以known_by_Gideon.html