Python相当于完整的网页下载

时间:2015-12-24 10:58:51

标签: python beautifulsoup

我正在尝试创建一个基本的刮刀,它将从Soundcloud上搜索用户名和歌曲标题。通过检查我需要的元素(使用Chrome),我发现我需要找到与每个标签'span'相关联的字符串title =“soundTitle__usernameText”。使用BeautifulSoupurllib2lxml,我有以下搜索'robert delong'的代码:

from lxml import html
from bs4 import BeautifulSoup
from urllib2 import urlopen
import requests

def search_results(url):
    html = urlopen(url).read() 
    # html = requests.get(url)      I've tried this also
    soup = BeautifulSoup(html, "lxml")
    usernames = [span.string for span in soup.find_all("span", "soundTitle__usernameText")]
    return usernames

print search_results('http://soundcloud.com/search?q=robert%20delong')

这将返回一个空列表。但是,当我通过选择文件>保存>格式网页,完成并使用该关联的HTML文件而不是使用urlopen获取的文件来保存Chrome上的完整网页时,代码会打印

  

[u'Two Door Cinema Club',u'whatever-28',u'AWOLNATION',u'Two Door Cinema Club',u'Sean Glass',u'Capital Cities',u'Robert DeLong', u'RAC',u'JR JR']

这是理想的结果。对我来说,似乎urlopen使用了一些截断的HTML代码来进行搜索,这就是它返回一个空列表的原因。

关于我如何能够访问通过手动保存网页获得的相同HTML,但使用Python /终端的任何想法?谢谢。

2 个答案:

答案 0 :(得分:3)

你猜对了。下载的HTML不包含所有数据。 Javascript用于以JSON格式请求信息,然后将其插入到文档中。

通过查看Chrome制作的请求(ctrl + shift + i,“网络”),我看到它请求了https://api-v2.soundcloud.com/search?q=robert%20delong。我相信对此的回应有您需要的信息。

实际上,这对你有好处。阅读JSON应该比解析HTML更直接;)

答案 1 :(得分:2)

这是您可以使用终端及其相关链接和图像下载网页html的代码:
wget -p --convert-links http://www.website.com/directory/webpage.html