使用 BeautifulSoup 通过超链接访问表格数据

Posted

技术标签:

【中文标题】使用 BeautifulSoup 通过超链接访问表格数据【英文标题】:Accessing tabular data via hyperlinks with BeautifulSoup 【发布时间】:2016-01-13 04:00:46 【问题描述】:

关于使用 BeautifulSoup,我仍有一些不明白的地方。我可以用它来解析网页的原始 html,这里是“example_website.com”:

from bs4 import BeautifulSoup # load BeautifulSoup class
import requests 
r  = requests.get("http://example_website.com")
data = r.text
soup = BeautifulSoup(data)
# soup.find_all('a') grabs all elements with <a> tag for hyperlinks    

然后,要检索和打印所有具有 'href' 属性的元素,我们可以使用 for 循环:

for link in soup.find_all('a'):
    print(link.get('href')) 

我不明白的是:我有一个包含多个网页的网站,每个网页都列出了几个超链接,这些超链接指向一个带有表格数据的网页。

我可以使用 BeautifulSoup 来解析主页,但是如何使用相同的 Python 脚本来抓取第 2 页、第 3 页等呢?您如何“访问”通过“href”链接找到的内容?

有没有办法编写一个 python 脚本来做到这一点?我应该使用蜘蛛吗?

【问题讨论】:

【参考方案1】:

您当然可以使用requests+BeautifulSoup 做到这一点。这将具有阻塞性质,因为您将逐个处理提取的链接,并且在完成当前链接之前不会继续下一个链接。示例实现:

from urlparse import urljoin

from bs4 import BeautifulSoup 
import requests 

with requests.Session() as session:    
    r = session.get("http://example_website.com")
    data = r.text
    soup = BeautifulSoup(data)

    base_url = "http://example_website.com" 
    for link in soup.find_all('a'):
        url = urljoin(base_url, link.get('href'))

        r = session.get(url)
        # parse the subpage

不过,它可能会很快变得复杂而缓慢。

您可能需要切换到Scrapy web-scraping framework,这使得网络抓取、爬网、跟踪链接变得容易(使用链接提取器查看CrawlSpider)、快速且非阻塞性质(它基于 Twisted) .

【讨论】:

"复杂而缓慢" 这就是问题所在。我想我必须一个一个地处理链接。对于“目录”类型的网站(例如,想想 Yelp),这会变得乏味。您将不得不编写多个 for 循环,并确保您没有跳过任何内容。 (我可能错了!)

以上是关于使用 BeautifulSoup 通过超链接访问表格数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Python中的BeautifulSoup从HTML链接解析嵌套表?

如何下载整个网站的图片(只能通过网址访问,无超链接)

关于超链接的四个伪类的一个问题(顺序问题)

创建用于通过python访问多个excel表的超链接

玩转报表超链接

链接访问的 SE Data Explorer 表