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

新人问问关于爬虫的2个问题

  •  
  •   gateswong ·
    Gateswong · 2013-05-28 01:19:09 +08:00 · 4660 次点击
    这是一个创建于 4227 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我现在在用Python在写一个爬虫,但是遇到了一些问题。这是我第一次在这里问问题,请允许我一一道来:

    *** 问题1 ***

    一开始我是用requests获取网页,用BeautifulSoup解析。
    我们令 content = 获取的网页.text 这就是网页的内容的字符串。
    这个字符串是完整的,因为将它直接输出成HTML文件可以看到完整的页面。
    根据官网的教程,我用BeautifulSoup解析它 parsed = BefaultSoup(r.text) 后发现parsed字符串会出现如下的样子:

    <td class="num"><a class="xi2" href="http://cssa-iit.s60-28.myverydz.com/forum.php?mod=viewthread&tid=62952&extra=page%3D1%26orderby%3Ddateline">1</a><em>47</em></td>
    <td class="by">
    <cite><a href="http://cssa-iit.s60-28.myver">y d z . c o m / h o m e . p h p ? m o d = s p a c e &u s e r n a m e = f d s a 1 2 3 " c = " 1 " > f d s a 1 2 3 / a > / c i t e >

    e m > a h r e f = " h t t p : / / c s s a - i i t . s 6 0 - 2 8 . m y v e r y d z . c o m / f o r u m . p h p ? m o d = r e d i r e c t &t i d = 6 2 9 5 2 &g o t o = l a s t p o s t # l a s t p o s t " > s p a n t i t l e = " 2 0 1 3 - 5 - 2 7 0 1 : 2 4 " > 9 &n b s p ; \鰁MR/ s p a n > / a > / e m >

    / t d >

    / t r >

    / t b o d y >

    t b o d y i d = " n o r m a l t h r e a d _ 6 2 9 4 9 " >

    t r >

    t d c l a s s = " i c n " >

    a h r e f = " h t t p : / / c s s a - i i t . s 6 0 - 2 8 . m y v e r y d z . c o m / f o r u m . p h p ? m o d = v i e w t h r e a d &a m p ; t i d = 6 2 9 4 9 &a m p ; e x t r a = p a g e % 3 D 1 % 2 6 o r d e r b y % 3 D d a t e l i n e " t i t l e = " 癳梲鉙Sb _" t a r g e t = " _ b l a n k " >

    i m g s r c = " s t a t i c / i m a g e / c o m m o n / f o l d e r _ n e w . g i f " / >

    / a >

    / t d >

    t h c l a s s = " n e w " >

    a h r e f = " h t t p : / / c s s a - i i t . s 6 0 - 2 8 . m y v e r y d z . c o m / f o r u m . p h p ? m o d = v i e w t h r e a d &a m p ; t i d = 6 2 9 4 9 &a m p ; e x t r a = p a g e % 3 D 1 % 2 6 o r d e r b y % 3 D d a t e l i n e " o n c l i c k = " a t a r g e t ( t h i s ) " c l a s s = " x s t " > 厤<pl>P H O N E 4 , 5 孴I P A D M I N I WY/ a >

    </pl></a></cite></td></tr></tbody></table></form></div></div></div></div></div></body></html>

    上述字符只是一部分内容,它的前部分和它之前的所有内容都是正常的字符串。
    中间一大块是有问题的内容,所有字符都成为了字符和空格交替的形式。
    最后一部分应该是BeautifulSoup自己添加的标签结束符。因为整个网页明显不完整,而且
    len(parsed) < len(content)
    而我在网上也尝试搜索,结果却是无从搜索。
    请问有人知道这是什么原因引起的吗。

    *** 问题2 ***

    后来我换用lxml解析网页内容。目前没有出现什么问题。不过我在获取正文文本时,不知道lxml该怎么直接获取某个节点的InnerHTML。所以我在下面这个网页中找到了一个方法:

    http://stackoverflow.com/questions/4624062/get-all-text-inside-a-tag-in-lxml?answertab=votes#tab-top

    经测试确实可用,不过截取到的内容变成了下面的样子:

    <i class="pstatus"> 本帖最后由 bbb324 于 2013-5-27 08:24 编辑 </i><br />
    <br />
    ps 3001, 纯实木床头柜,只要20.<br />
    <br />
    小的10块<br />
    <br />

    这段文本是用 print 打印出来的,所以这些就是实际字符串内容。那么我在将其保存在数据库之前有没有必要将所有 &#数字; 实体转换成对应的字符呢?最好请给出理由

    P.S:这段字符串直接COPY到Chrome的DebugTool中可以自动转换成字符。

    -------------------------------于是问题问完了--------------------------------------

    谢谢大家
    4 条回复    1970-01-01 08:00:00 +08:00
    hadoop
        1
    hadoop  
       2013-05-28 08:50:31 +08:00 via Android
    对于问题1,paserd应该是一个beautifulsoup对象,所以len得到的结果肯定个字符串不等啊。
    alsotang
        2
    alsotang  
       2013-05-28 13:05:09 +08:00
    楼主的问题太长了,我随口说说看看用不用得上吧。

    1. Beautifulsoup 会自动美化不完整的网页,所以前后长度不等。

    2. 实体要转成字符,便于以后可能存在的搜索之类的事情。而且实体只是对于浏览器有意义,对于数据库来说,还是字符有意义。
    gateswong
        3
    gateswong  
    OP
       2013-05-28 19:39:45 +08:00
    @alsotang
    谢谢,第二点我明白了
    第一点那个,问题应该不是美化,而是因为BeautifulSoup解析出来的网页完整度都不够
    hadoop
        4
    hadoop  
       2013-05-28 20:40:51 +08:00 via Android
    @gateswong parsed是一个对象,你用来跟字符串比较长度肯定不等
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5812 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 03:19 · PVG 11:19 · LAX 19:19 · JFK 22:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.