2009-10-25 69 views
0

我想提取某些网站上的文字。 这里是网址我想提取一些文字来制作刮板。 在这个页面中,我想分别提取一些带有主题和内容字段的文本。 例如,如果您打开网页,你可以看到在网页一些文本,如何使用lxml提取一些文本?

日本东京国际电影节 EPA연합뉴스세계| 2009.10.25(일)오후7:21 日本,2009年10月25日。由于她在法国电影导演Xabi Molia执导的电影“Eight Times Up”中扮演角色,因此她获得最佳女主角奖。 EPA/DAI KUROKAWA

日本东京国际电影节 美国环保署연합뉴스세계| 2009.10.25(일)오후7:18 她获悉法国电影导演Xabi Molia在第22届东京颁奖典礼期间在电影“Eight Times Up”中的角色获得最佳女主角奖...

等,,,,

,最后我想提取文本,就像格式

主题:日本东京国际电影节 内容:EPA연합뉴스세계| 2009.10.25(일)下午7:21日本,2009年10月25日。由于她在法国电影导演Xabi Molia指导的电影“Eight Times Up”中扮演的角色,Gayet获得最佳女主角奖。 EPA/DAI黑川

主题:... 内容:...

章等.. 如果有人帮忙,真的很感谢。 在此先感谢。

+1

您能向我们展示您的尝试,以便我们可以看到您遇到问题的位置吗? – Mark 2009-10-25 17:30:37

+0

对于迟到的回复感到抱歉,这里是凌晨。 :) 我附上了我的废料源在pastebin网站。 http://elca.pastebin.com/m52e7d8e0 目前有一些probelm,非常感谢 – paul 2009-10-25 22:42:06

回答

2

一般来说,要解决这些问题,您必须首先下载感兴趣的页面作为文本(使用urllib.urlopen或其他任何东西,甚至是外部实用工具,如curl或wget,但不是浏览器,因为您想查看页面的外观之前任何Javascript都有机会运行)并研究它以了解其结构。在这种情况下,一些研究之后,你会发现相关的部分(在head剪断一些无关紧要的零部件,打破排队的可读性)...:

<body onload=nx_init();> 
<dl> 
<dt> 
<a href="http://news.naver.com/main/read.nhn?mode=LSD&mid=sec&sid1=&oid=091&aid=0002497340" 
[[snipping other attributes of this tag]]> 
JAPAN TOKYO INTERNATIONAL FILM FESTIVAL</a> 
</dt> 
<dd class="txt_inline"> 
EPA¿¬ÇÕ´º½º ¼¼°è <span class="bar"> 
|</span> 
2009.10.25 (ÀÏ) ¿ÀÈÄ 7:21</dd> 
<dd class="sh_news_passage"> 
Japan, 25 October 2009. Gayet won the Best Actress Award for her role in the film 'Eight <b> 
Times</b> 
Up' directed by French filmmaker Xabi Molia. EPA/DAI KUROKAWA</dd> 

等等。因此,您需要将<a>标签的内容作为“主题”在<dt>之内,并将其作为“内容”后面的<dd>标签的内容(在同一<dl>中)。

你得到的报头包含:

Content-Type: text/html; charset=ks_c_5601-1987 

所以你也必须找到一种方法来解释编码转换成Unicode - 我相信,编码也被称为'euc_kr'和我的Python安装似乎来了编解码器,但你也应该检查你的。

一旦你确定了所有这些方面,你就会尝试lxml.etree.parse这个URL--就像很多其他网页一样,它不会解析 - 它并不真正呈现格式良好的HTML(尝试w3c的验证器可以找出它被破坏的一些方法)。

由于格式错误的HTML在网络上非常普遍,因此存在一些“宽容的解析器”,它们试图弥补常见的错误。在Python中最受欢迎的是BeautifulSoup,事实上lxml也带有它 - 使用lxml 2.0.3或更高版本,可以使用BeautifulSoup作为底层解析器,然后继续“就好像”文档已经正确解析 - 但是我发现直接使用BeautifulSoup更简单。

例如,下面是一个脚本,用于在该URL发出前几个主题/内容对(它们当前已更改,原本它们与您给出的相同;-)。您需要一个支持Unicode输出的终端(例如,我可以在Mac的Terminal.App中设置为utf-8的情况下运行此功能) - 当然,您也可以收集Unicode片段(例如追加它们到列表和''.join他们当你拥有所有必需的部件),它们编码只要你愿意等,等

from BeautifulSoup import BeautifulSoup 
import urllib 

def getit(pagetext, howmany=0): 
    soup = BeautifulSoup(pagetext) 
    results = [] 
    dls = soup.findAll('dl') 
    for adl in dls: 
    thedt = adl.dt 
    while thedt: 
     thea = thedt.a 
     if thea: 
     print 'SUBJECT:', thea.string 
     thedd = thedt.findNextSibling('dd') 
     if thedd: 
     print 'CONTENT:', 
     while thedd: 
      for x in thedd.findAll(text=True): 
      print x, 
      thedd = thedd.findNextSibling('dd') 
     print 
     howmany -= 1 
     if not howmany: return 
     print 
     thedt = thedt.findNextSibling('dt') 

theurl = ('http://news.search.naver.com/search.naver?' 
      'sm=tab%5Fhty&where=news&query=times&x=0&y=0') 
thepage = urllib.urlopen(theurl).read() 
getit(thepage, 3) 

的逻辑LXML或“BeautifulSoup在LXML衣”,是不是很不同,只是各种导航操作的拼写和大小有所变化。

+0

你好,我真的很感激,你的努力! ,这几乎是我想要的100%。 另外,是否可以与PAMIE模块一起使用我的脚本源代码?我害怕,是否必须打开另一个新线程。 谢谢 – paul 2009-10-25 22:49:23

+0

嗨,我忘记了,http://elca.pastebin.com/m52e7d8e0 这里是我目前正在制作的scraper脚本源代码。 再次感谢 – paul 2009-10-25 23:02:11

+0

@保尔,我确实相信关闭这个问题(接受最有帮助的答案),并在另一个问题上提出另一个问题是适当的礼节:在问题中混合问题,因为它们在代码中彼此靠近有帮助! – 2009-10-26 04:11:10