V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
hao1032
V2EX  ›  Python

python 如何获取一个网址的标题??

  •  
  •   hao1032 · 2014-04-18 11:45:02 +08:00 · 9695 次点击
    这是一个创建于 3866 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1.网上有类似的服务吗?
    给一个网址如www.baidu.com,返回网页的标题 百度一下

    2.有能满足这个需求的源码吗?
    因为什么样的网站都有自己写还要处理编码什么的。
    第 1 条附言  ·  2014-05-24 23:19:53 +08:00
    文档: http://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html
    使用了@kehr 说的bs4,用的就是链接里面的例子。
    soup.title.string
    # u'The Dormouse's story'

    在用的过程中还是遇到乱码了,就是用这个方法获取这个网址的title是乱码,不知有解不?
    http://www.joy.cn/
    24 条回复    2017-08-30 17:21:12 +08:00
    nervouna
        1
    nervouna  
       2014-04-18 11:56:41 +08:00
    你确定你只要 title?这算是抓取网页里最简单的一件事了吧……
    Google Beautiful Soup
    ericls
        2
    ericls  
       2014-04-18 12:20:34 +08:00 via Android
    手机打一个
    from pyquery import PyQuery as pq

    d=py(url)
    d('title').text

    不知道对不对
    fay
        3
    fay  
       2014-04-18 12:27:19 +08:00
    我在开发自己的莲蓬网的时候,需要获取网页标题等信息,顺手抽离了这部分的代码: https://github.com/fay/pagemeta
    tonghuashuai
        4
    tonghuashuai  
       2014-04-18 13:06:42 +08:00
    1 #!/usr/bin/env python
    2 #coding:utf-8
    3
    4 import urllib
    5 import re
    6
    7
    8 def get_title(url):
    9 title = ''
    10 c = urllib.urlopen(url)
    11 html = c.read()
    12
    13 p = '<title>.*?</title>'
    14 target = re.findall(p, html)
    15
    16 if target:
    17 title = target[0]
    18
    19 return title
    20
    21 if __name__ == '__main__':
    22 url = 'http://www.baidu.com'
    23 title = get_title(url)
    24 print title

    简单实现,没加异常处理
    tonghuashuai
        5
    tonghuashuai  
       2014-04-18 13:07:01 +08:00
    行号杯具了
    davidli
        6
    davidli  
       2014-04-18 15:07:28 +08:00
    楼上正解

    网站的标题应该都是在<title></title>里吧。
    yhf
        7
    yhf  
       2014-04-18 15:24:56 +08:00 via iPhone
    BeautifulSoup 随便哪个节点由你抓
    lifemaxer
        8
    lifemaxer  
       2014-04-18 15:31:30 +08:00
    以当前页为例,
    soup = BeautifulSoup(content) #content为当前页数据
    a = soup.find_all('title')[0].get_text()
    hao1032
        9
    hao1032  
    OP
       2014-04-18 16:23:58 +08:00
    @tonghuashuai
    这个在实际应用中会出错的,获取的title编码不知道是什么,还要获取网页里面的charset,然后解码。

    @lifemaxer 这个我试试看看会不会出现乱码的问题。
    hao1032
        10
    hao1032  
    OP
       2014-04-18 16:28:04 +08:00
    @tonghuashuai
    这个在实际应用中会出错的,获取的title编码不知道是什么,还要获取网页里面的charset,然后解码。
    更恶心的是网页中写的charset又不一定是正确的(就遇到过这样的奇葩网站),然后用charset去解又会出错。
    Crossin
        11
    Crossin  
       2014-04-18 17:14:10 +08:00
    @hao1032 那就用chardet判断一下编码
    lm902
        12
    lm902  
       2014-04-19 10:03:58 +08:00
    text.split("<title>")[1].split("</title>")[0]
    kehr
        13
    kehr  
       2014-04-20 10:00:38 +08:00   ❤️ 1
    刚做了网页抓取。推荐BeautifulSoup无压力。

    文档: http://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html
    hao1032
        14
    hao1032  
    OP
       2014-05-24 23:04:32 +08:00
    @kehr 使用bs4,用的就是你发到链接里面的例子。
    soup.title.string
    # u'The Dormouse's story'

    在用的过程中还是遇到乱码了,就是用这个方法获取这个网址的title是乱码,不知有解不?
    http://www.joy.cn/
    cloverstd
        15
    cloverstd  
       2014-05-25 00:55:03 +08:00
    乱码可能是 gzip 压缩了
    binux
        16
    binux  
       2014-05-25 01:09:15 +08:00
    @hao1032 requests
    caomu
        17
    caomu  
       2014-05-25 01:14:37 +08:00
    1.网上有类似的服务吗?
    > 关于这个我想到的是 YQL 。。。
    Sylv
        18
    Sylv  
       2014-05-25 04:40:08 +08:00
    @hao1032

    import requests
    from bs4 import BeautifulSoup

    r = requests.get("http://www.joy.cn")
    r.encoding = requests.utils.get_encodings_from_content(r.content)[0]
    soup = BeautifulSoup(r.text)
    print soup.title.string


    参考: http://liguangming.com/python-requests-ge-encoding-from-headers
    ccbikai
        19
    ccbikai  
       2014-05-25 14:20:20 +08:00 via Android
    @Sylv 18楼和我的方法一样,如果乱码最后一句改print soup.title.get_text()
    dbow
        20
    dbow  
       2014-05-25 18:26:01 +08:00
    上lxml用XPATH表达式最快,"html/head/title"

    from lxml import etree
    etree.HTML(content).xpath("/html/head/title")[0]
    diaoleona
        21
    diaoleona  
       2014-05-27 14:20:08 +08:00
    @dbow 不能同意更多
    hao1032
        22
    hao1032  
    OP
       2014-05-29 13:30:37 +08:00
    @Sylv 这个要加个import,我看了这个文章http://www.cnblogs.com/todoit/archive/2013/04/08/3008513.html
    加了个from_encoding="gb18030",测试这个网站是可以的。
    如果后面有问题,再使用你的这个方法。
    xiaowangge
        23
    xiaowangge  
       2014-09-05 17:17:29 +08:00
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-

    import requests
    from lxml import html

    response = requests.get('http://www.joy.cn/')

    # Parse the body into a tree
    parsed_body = html.fromstring(response.text)

    print ''.join(parsed_body.xpath('//title/text()'))
    funnybunny00
        24
    funnybunny00  
       2017-08-30 17:21:12 +08:00
    福音
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   904 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 20:25 · PVG 04:25 · LAX 12:25 · JFK 15:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.