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
a412739861
V2EX  ›  Python

请教一个( BeautifulSoup)爬虫获取标签 text 内容时,对带有<font></font>这类类标签处理方法。

  •  
  •   a412739861 · 2016-05-07 01:45:44 +08:00 · 15469 次点击
    这是一个创建于 3126 天前的主题,其中的信息可能已经有所发展或是发生改变。
    尝试着用 python3 和 BeautifulSoup4 爬一些内容。
    显示登陆之类的,然后使用 BS 的 find_all("tr")功能就都可以找到所有 tr 标签,用遍历打印 result.td.string 的方法,打印每个表格下第一个 td 的标签内容

    有一个的 td.string 报错,无法只打印出标签文字内容。只有 None
    我把这个 td 的全部内容直接打印出来,出现如下形式:

    <td colspan="2">名称:XXX<font color="#E1E100">xxx</font></td>

    问题就应该是出在标签内容里的<font color></font>标签,识别失败。

    我想到的办法是,大概把这段内容正则匹配,去掉后面的标签,正则不太熟练,想问问 BeautifulSoup 本身的功能能否比较好的解决这一点呢?

    其实还有一个比较奇怪的问题,同一个网页,我用网络请求的办法去获取这个网页,解析没问题,当我自己下载了以后,再去用 BeautifulSoup 的 open 方法打开就不行。我记得很早以前我下载了再去解析是可以的……网页编码是 gbk 。
    第 1 条附言  ·  2016-05-14 11:02:38 +08:00
    标题的问题, 3L 提供的方案可以很快解决。我自己的尝试在 4L 。
    append 一下正文里另外一个小问题的解决办法:
    使用系统的 open 方法时,把编码带上 open(path, encoding='gbk')然后在用 BS4 打开其中的文章就可以了。
    BS4 应该的 open 方法里面也有这个参数,不过当初开始用的时候,出错了。
    可能是因为这个文件标明的是 UTF-8 ,实际则是 gbk 的原因吧。
    4 条回复    2016-05-07 11:03:30 +08:00
    pimin
        1
    pimin  
       2016-05-07 01:58:58 +08:00 via Android   ❤️ 1
    直接解析 HTML 不就可以了
    一般用 lxml 比较多
    TaoAlpha
        2
    TaoAlpha  
       2016-05-07 02:46:14 +08:00   ❤️ 1
    .findAll(text=True) 可以直接提取 text, 忽略内部所有嵌套的 tag.
    ahcat
        3
    ahcat  
       2016-05-07 03:19:03 +08:00 via iPhone   ❤️ 1
    不用 string ,用 get_text ()
    a412739861
        4
    a412739861  
    OP
       2016-05-07 11:03:30 +08:00
    @pimin
    获取网页时,解析用的是 HTML ,代码是 BeautifulSoup(html.content, "html.parser")
    本地 open 时,好像无法选择, open (地址),无法加上 html.parser


    @TaoAlpha
    findAll(text=True)时,的确会直接提取整个 html 的 text 。
    但是一旦我加上 BS 的 find_all("tr"), name 参数,再加上 keywords 查找对应 tag 里面含有某个属性的筛选条件时,就不行了,只打印出[]。
    搜索到的一个文档,说「如果你使用 text ,任何指定给 name 以及 keyword 参数的值都会被忽略。」。

    看了下文档, text 可以接受正则,我把搜索条件用正则写在 text=re.compile("pattern"),取出掉前面的 name 和 keywords 参数,的确能够直接搜索到要内容。^_^


    @ahcat
    这方法我喜欢,简单粗暴直接有效!
    特意在文档里搜索,写的是返回文字内容。没写对这些的标签的处理,大概作者认为使用者都是 html 有比较好的了解,能够领悟吧(为自己没仔细看找借口)………
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1384 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 17:37 · PVG 01:37 · LAX 09:37 · JFK 12:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.