使用python生成站点地图

时间:2017-09-27 11:12:48

标签: python beautifulsoup web-crawler

我正在尝试解析网页并使用python创建站点地图。我写了下面的代码 -

import urllib2
from bs4 import BeautifulSoup
mypage = "http://example.com/"
page = urllib2.urlopen(mypage)

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

all_links = soup.find_all('a')

for link in all_links:
    print link.get('href')

以上代码打印example.com(外部和内部)中的所有链接。

  • 我需要过滤外部链接并仅打印内部链接,我知道我可以使用域名“example.com”和“somethingelse.com”或其他名称来区分它们,但我无法获取此格式的RE格式 - 或者是否有任何内置库有助于实现此目的
  • 获得所有内部链接后 - 如何映射它们。例如,"example.com"已链接到"example.com/page1",其链接指向"example.com/page3"。为这种流程创建地图的理想方法是什么?我正在寻找一个显示"example.com" -> "example.com/page1" -> "example.com/page3"或类似内容的库或逻辑

2 个答案:

答案 0 :(得分:2)

对于第一个问题,您可以使用urlparse来解析主机名并检查域名。不要使用手动正则表达式来做到这一点,使用像这样的核心库会更容易。参见:

from urllib.parse import urlparse
parsed = urlparse(url)
hostname = parsed.hostname`

对于您的第二个问题,您的数据结构看起来像图表不是吗?您可以使用自定义图形数据结构,其中包含节点和链接。或者您可以使用为此目的而制作的图形数据库。尽管如此,这两种解决方案都将非常复杂。我认为最好只使用字典数据类型,其中key是页面的URL,value是该页面中的链接列表。在这种情况下,您无法像在图表中那样轻松地关注链接,但它仍然可以解决问题。您还可以保留另一组数据类型,以跟踪您访问过的链接。

答案 1 :(得分:0)

我已经编写了一段代码,用于在python烧瓶框架中生成sitemap.xml文件

import xml.etree.cElementTree as ET
import datetime

    def registerSiteMaps():
        root = ET.Element('urlset')
        root.attrib['xmlns:xsi']="http://www.w3.org/2001/XMLSchema-instance"
        root.attrib['xsi:schemaLocation']="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"
        root.attrib['xmlns']="http://www.sitemaps.org/schemas/sitemap/0.9"

        q = db.result

        for doc in q.results:
            uid = doc['uid']
            site_root = uid.replace('__', '/').replace('_', '-')
            dt = datetime.datetime.now().strftime ("%Y-%m-%d")
            doc = ET.SubElement(root, "url")
            ET.SubElement(doc, "loc").text = "https://www.example.com/"+site_root
            ET.SubElement(doc, "lastmod").text = dt
            ET.SubElement(doc, "changefreq").text = "weekly"
            ET.SubElement(doc, "priority").text = "1.0"

        tree = ET.ElementTree(root)
        tree.write('sitemap.xml', encoding='utf-8', xml_declaration=True)

有关更多详细信息,请遵循此link