使用beautifulSoup / lxml抓取所有链接

时间:2014-04-17 06:43:27

标签: python python-2.7 web-scraping beautifulsoup lxml

http://www.snapdeal.com/

我试图废弃此网站上的所有链接,当我这样做时,我得到了意想不到的结果。我发现这是因为javascript而发生的。

"查看所有类别"选项卡,您将找到所有主要产品类别。如果将鼠标悬停在任何类别上,它将扩展类别。我想要每个主要类别的链接。

url = 'http://www.snapdeal.com/'
data = urllib2.urlopen(url)
page = BeautifulSoup(data)
#print data
for link in page.findAll('a'):
       l = link.get('href')
       print l

但这给了我不同的结果,我的预期(我关闭了java脚本并查看了页面源代码,输出来自此源代码)

我只想查找每个主要类别的所有子链接。有什么建议会欣赏吗?

6 个答案:

答案 0 :(得分:2)

发生这种情况只是因为你让BeautifulSoup选择了自己最好的解析器,而你可能没有安装lxml。

最好的选择是使用html.parser来解析网址。

from bs4 import BeautifulSoup
import urllib2
url = 'http://www.snapdeal.com/'
data = urllib2.urlopen(url).read()

page = BeautifulSoup(data,'html.parser')

for link in page.findAll('a'):
       l = link.get('href')
       print l  

这对我有用。请确保安装依赖项。

答案 1 :(得分:1)

Categories Menu是您要查找的网址。许多网站使用XHR(XMLHTTPRequest)动态生成内容。 为了检查网站的组件,请熟悉Firefox中的Firebug插件或Chrome中的开发人员工具(内置插件)。您可以在上述附加组件的网络选项卡下查看网站中使用的XHR。

答案 2 :(得分:0)

我认为你应该尝试另一个库,例如selenium ,它为你提供一个网络驱动程序,这就是这个库的优点,对于我自己,我无法用bs4处理javascripts。

答案 3 :(得分:0)

使用网络抓取工具,例如scrapymechanize 在机械化中,要获取snapdeal主页中的所有链接,

br=Browser()
br.open("http://www.snapdeal.com")
for link in browser.links():
    print link.name
    print link.url

答案 4 :(得分:0)

我一直在寻找一种从网页中抓取链接的方法,这些网页只在实际浏览器中呈现,但希望使用无头浏览器运行结果。

我能够使用phantomJS,selenium和beautiful soup

来实现这一目标
#!/usr/bin/python

import bs4
import requests
from selenium import webdriver

driver = webdriver.PhantomJS('phantomjs')
url = 'http://www.snapdeal.com/'
browser = driver.get(url)
content = driver.page_source
soup = bs4.BeautifulSoup(content)
links = [a.attrs.get('href') for a in soup.find_all('a')]
for paths in links:
    print paths
driver.close()

答案 5 :(得分:0)

以下示例将同时适用于HTTPHTTPS。我正在写此答案,以说明如何在Python 2Python 3中都可以使用它。

Python 2

这受this answer的启发。

from bs4 import BeautifulSoup
import urllib2
url = 'https://stackoverflow.com'
data = urllib2.urlopen(url).read()

page = BeautifulSoup(data,'html.parser')

for link in page.findAll('a'):
       l = link.get('href')
       print l 

Python 3

from bs4 import BeautifulSoup
from urllib.request import urlopen
import ssl

# to open up HTTPS URLs
gcontext = ssl.SSLContext()

# You can give any URL here. I have given the Stack Overflow homepage
url = 'https://stackoverflow.com'
data = urlopen(url, context=gcontext).read()

page = BeautifulSoup(data, 'html.parser')

for link in page.findAll('a'):
    l = link.get('href')
    print(l)

其他语言

有关其他语言,请参见this answer