使用BeautifulSoup刮取网页以获取链接标题和URL

时间:2017-01-09 21:00:38

标签: python html text web-scraping beautifulsoup

我有一个热门文章的网页,我想抓取每个引用的网页的超链接和它显示的文章的标题。

我的脚本所需的输出是一个CSV文件,它在一行中列出每个标题和文章内容。因此,如果此网页上有50篇文章,我想要一个包含50行和100个数据点的文件。

我的问题是文章标题及其超链接包含在一个SVG容器中,这让我失望。我之前使用过BeautifulSoup进行网页抓取,但我不确定如何选择每篇文章的标题和超链接。非常感谢任何和所有帮助。

import requests 
from bs4 import BeautifulSoup 
import re 

res = requests.get('http://fundersandfounders.com/what-internet-thinks-based-on-media/') 
res.raise_for_status() 
playFile = open('top_articles.html', 'wb') 
for chunk in res.iter_content(100000): 
    playFile.write(chunk) 
    f = open('top_articles.html') 
    soup = BeautifulSoup(f, 'html.parser') 
    links = soup.select('p') #i know this is where i'm messing up, but i'm not sure which selector to actually utilize so I'm using the paragraph selector as a place-holder
    print(links)

我知道这实际上是一个两步项目:我的脚本的当前版本不会遍历所有超链接的列表,这些超链接的实际内容我将要抓取。这是我可以自己轻松执行的第二步,但是如果有人想写这一点,那就是对你的称赞。

1 个答案:

答案 0 :(得分:1)

您应该分两步完成:

  • 解析HTML并提取指向 val nums1 = BitSet(3, 2).toBitMask val nums2 = BitSet(3, 2, 0).toBitMask
  • 的链接
  • 下载svg页面,使用svg解析并提取"起泡"

实现:

BeautifulSoup

打印文章标题和资源:

from urllib.parse import urljoin  # Python3

import requests
from bs4 import BeautifulSoup


base_url = 'http://fundersandfounders.com/what-internet-thinks-based-on-media/'

with requests.Session() as session:
    # extract the link to svg
    res = session.get(base_url)
    soup = BeautifulSoup(res.content, 'html.parser')
    svg = soup.select_one("object.svg-content")
    svg_link = urljoin(base_url, svg["data"])

    # download and parse svg
    res = session.get(svg_link)
    soup = BeautifulSoup(res.content, 'html.parser')
    for article in soup.select("#bubbles .bgroup"):
        title, resource = [item.get_text(strip=True, separator=" ") for item in article.select("a text")]
        print("Title: '%s'; Resource: '%s'." % (title, resource))