使用urllib.urlopen()函数无法获取网页源代码

3
我正在尝试从'https://www.youtube.com/trendsdashboard#loc0=ind'获取视频链接。当我检查元素时,它会为每个视频显示源HTML代码。在使用的源代码中保留HTML标记。
urllib2.urlopen("https://www.youtube.com/trendsdashboard#loc0=ind").read()

它不显示视频的html源代码。是否有其他方法可以实现?
<a href="/watch?v=dCdvyFkctOo" alt="Flipkart Wish Chain">
        <img src="//i.ytimg.com/vi/dCdvyFkctOo/hqdefault.jpg" alt="Flipkart Wish Chain">
      </a>

当我们通过浏览器检查元素时,会看到这段简单的代码,但在使用urllib获取的源代码中却找不到。

1
你能添加一部分代码,用于访问YouTube页面吗? - wanderlust
是的。你刚刚将一个套接字连接到了网页,但没有从中读取数据。 - Aditya
@wanderlust:好的,请检查更新后的代码。 - nlper
@AdityaJoshi:已经完成了,忘记在问题中提到read(),已更新。 - nlper
4个回答

1

适用于我...

import urllib2
url = 'https://www.youtube.com/trendsdashboard#loc0=ind'
html = urllib.urlopen(url).read()

在我看来,我会使用requests而不是urllib——它更容易使用:

import requests
url = 'https://www.youtube.com/trendsdashboard#loc0=ind'
response = requests.get(url)
html = response.content

编辑

这将获取您编辑后所有带有超链接的<a></a>标签列表。我使用库BeautifulSoup来解析HTML:

from bs4 import BeautifulSoup
soup = BeautifulSoup(html)
links = [tag for tag in soup.findAll('a') if tag.has_attr('href')]

谢谢,你能看一下我在源代码中描述的/watch?v=dCdvyFkctOo和其他源代码吗? - nlper

1
要查看源代码,您需要使用read方法。如果只是使用open,则会得到以下内容。
In [12]: urllib2.urlopen('https://www.youtube.com/trendsdashboard#loc0=ind')
Out[12]: <addinfourl at 3054207052L whose fp = <socket._fileobject object at 0xb60a6f2c>>

要查看源代码,请使用 read
urllib2.urlopen('https://www.youtube.com/trendsdashboard#loc0=ind').read()

1
@nlper 或许您需要使用 Mechanize 模块来完成此操作。 - Ajay
Mechanize模块有什么链接或示例吗? - nlper
http://stackoverflow.com/questions/8852041/how-to-download-youtube-videos-using-a-python-script - Ajay

1

如果你想比较Python代码和Web浏览器之间的源代码,请不要使用检查元素(Inspect Element),而是右键单击网页并点击“查看源代码”,然后你会找到实际的源代码。检查元素显示了由创建的所有网络请求和执行的JavaScript代码返回的聚合源代码。

在打开网页之前保持开发人员控制台(Developer Console)开启,在网络选项卡上停留,并确保对于Chrome的“保存日志”或Firefox中的Firebug的“持久化”已打开,然后您将看到进行的所有网络请求。


另外,尝试在头文件中发送User-Agent字符串。这是非常重要的一部分。在这种情况下,Requests库更容易使用。我会发布一个例子。 - Vikas Ojha
谢谢,但是我在检查元素中看到的代码并没有出现在页面源代码中。我期望能够看到视频链接,它们在页面上存在,但是当我获取源代码时却没有出现? - nlper
1
这就是我想表达的意思。那个源与你通过Python代码接收到的相同。所以请按照我在答案中解释的查看网络选项卡,尝试查看所有发出的请求。 - Vikas Ojha
再次感谢,但即使勾选了保留选项卡,网络选项卡仍然为空。 - nlper
实际上,您没有正确地使用它。您是否正在使用Chrome浏览器?此外,请仅在打开Network选项卡并单击“保留日志”后加载网页。 - Vikas Ojha

0
我们还需要将数据解码为utf-8格式。 以下是代码:
只需要使用 response.decode('utf-8') print(response)

这只是一条评论,而不是答案。随着更多的声望,您将能够发布评论。目前,我已经为您添加了评论,并标记此帖子以进行删除。 - Enamul Hassan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接