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

2013-05-28 01:19:09 +08:00
 gateswong
我现在在用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&amp;tid=62952&amp;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 &amp;u s e r n a m e = f d s a 1 2 3 " c = " 1 " &gt; f d s a 1 2 3 / a &gt; / c i t e &gt;

e m &gt; 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 &amp;t i d = 6 2 9 5 2 &amp;g o t o = l a s t p o s t # l a s t p o s t " &gt; s p a n t i t l e = " 2 0 1 3 - 5 - 2 7 0 1 : 2 4 " &gt; 9 &amp;n b s p ; \鰁MR/ s p a n &gt; / a &gt; / e m &gt;

/ t d &gt;

/ t r &gt;

/ t b o d y &gt;

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

t r &gt;

t d c l a s s = " i c n " &gt;

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 &amp;a m p ; t i d = 6 2 9 4 9 &amp;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 " &gt;

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 " / &gt;

/ a &gt;

/ t d &gt;

t h c l a s s = " n e w " &gt;

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 &amp;a m p ; t i d = 6 2 9 4 9 &amp;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 " &gt; 厤<pl>P H O N E 4 , 5 孴I P A D M I N I WY/ a &gt;

</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"> &#26412;&#24086;&#26368;&#21518;&#30001; bbb324 &#20110; 2013-5-27 08:24 &#32534;&#36753; </i><br />
<br />
ps 3001&#65292; &#32431;&#23454;&#26408;&#24202;&#22836;&#26588;&#65292;&#21482;&#35201;20.<br />&#13;
<br />&#13;
&#23567;&#30340;10&#22359;<br />&#13;
<br />&#13;

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

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

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

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

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

2. 实体要转成字符,便于以后可能存在的搜索之类的事情。而且实体只是对于浏览器有意义,对于数据库来说,还是字符有意义。
gateswong
2013-05-28 19:39:45 +08:00
@alsotang
谢谢,第二点我明白了
第一点那个,问题应该不是美化,而是因为BeautifulSoup解析出来的网页完整度都不够
hadoop
2013-05-28 20:40:51 +08:00
@gateswong parsed是一个对象,你用来跟字符串比较长度肯定不等

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/70351

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX