首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用lxml提取一些文本?

如何使用lxml提取一些文本?
EN

Stack Overflow用户
提问于 2009-10-26 01:01:57
回答 1查看 1K关注 0票数 0

我想在某些网站上提取一些文本。这是网址,我想提取一些文字来制作刮板。http://news.search.naver.com/search.naver?sm=tab_hty&where=news&query=times&x=0&y=0在此页面中,我想分别提取一些带有主题和内容字段的文本。例如,如果您打开该页面,您可以在页面中看到一些文本,

日本东京国际电影节环境保护局연합뉴스세계| 2009.10.25 (일)오후7:21日本,2009年10月25日。Gayet凭借在法国电影制作人Xabi Molia执导的电影“八倍向上”中的角色获得了最佳女主角奖。EPA/戴黑川

日本东京国际电影节연합뉴스세계| 2009.10.25 (일)오후7:18 )在第22届东京国际电影节颁奖典礼上,她得知自己因在法国电影导演夏比·莫利亚执导的电影“八倍向上”中扮演的角色而获得最佳女主角奖。

以此类推……

最后,我想提取如下格式的文本

主题:日本东京国际电影节内容:环境保护局연합뉴스세계| 2009.10.25 (일)오후7:21일)오후,2009年10月25日。Gayet凭借在法国电影制作人Xabi Molia执导的电影“八倍向上”中的角色获得了最佳女主角奖。EPA/戴黑川

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

以此类推..如果有人能帮忙,真的很感谢。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-10-26 03:01:13

通常,要解决此类问题,必须首先以文本形式下载感兴趣的页面(使用urllib.urlopen或其他任何工具,甚至使用curl或wget等外部实用程序,但不要使用浏览器,因为您希望在任何Javascript运行之前查看页面的外观),并对其进行研究以了解其结构。在这种情况下,经过一些研究,您会发现相关的部分是(在head中剪切一些不相关的部分,并为了可读性而拆分代码行)...:

代码语言:javascript
复制
<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>

以此类推。因此,您希望将<dt>中的<a>标记的内容作为"subject“,并将它后面的<dd>标记的内容作为" content”(在同一个<dl>中)。

您得到的报头包含:

代码语言:javascript
复制
Content-Type: text/html; charset=ks_c_5601-1987

因此,您还必须找到一种将编码解释为Unicode的方法--我认为编码也称为'euc_kr',我的Python安装似乎附带了一个编解码器,但是您也应该检查一下您的编码。

一旦您确定了所有这些方面,您就可以尝试lxml.etree.parse URL --就像许多其他网页一样,它不能解析--它并不能真正呈现格式良好的超文本标记语言(请尝试使用W3C的验证器对其进行验证,以了解其损坏的一些方式)。

由于格式错误的HTML在web上非常常见,因此存在试图补偿常见错误的“容错解析器”。Python语言中最流行的是BeautifulSoup,实际上lxml也附带了它--在lxml 2.0.3或更高版本中,您可以使用BeautifulSoup作为底层解析器,然后“就像”文档被正确解析一样继续进行--但我发现直接使用BeautifulSoup更简单。

例如,这里有一个脚本在该URL上发出前几个主题/内容对(它们最近发生了变化,最初它们与您给出的相同;-)。您需要一个支持Unicode输出的终端(例如,我在设置为utf-8的Mac的Terminal.App上运行这个终端没有问题) --当然,除了print之外,您还可以收集Unicode片段(例如,将它们附加到一个列表中,当您有了所有需要的片段时对它们进行''.join ),随心所欲地对它们进行编码,等等。

代码语言:javascript
复制
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中的逻辑并没有太大的不同,只是不同导航操作的拼写和大小写略有不同。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1621410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档