【问题标题】:how to extract some text by use lxml?如何使用 lxml 提取一些文本?
【发布时间】:2009-10-25 17:01:57
【问题描述】:

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

日本东京国际电影节 EPA연합뉴스세계 | 2009.10.25 (일) 오후 7:21 日本,2009 年 10 月 25 日。Gayet 凭借在法国电影制片人 Xabi Molia 执导的电影《八倍向上》中的角色获得最佳女演员奖。 EPA/大黑川

日本东京国际电影节 EPA연합뉴스세계 | 2009.10.25 (일) 오후 7:18 在第 22 届东京颁奖典礼上,她得知自己在法国电影导演 Xabi Molia 的电影《八倍向上》中的角色获得了最佳女演员奖……

等等,,,,

最后我想提取诸如格式之类的文本

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

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

等等.. 如果有人帮助,真的很感激。 提前致谢。

【问题讨论】:

  • 您能否向我们展示您的尝试,以便我们了解您的问题所在?
  • 抱歉回复晚了,这里是清晨。 :) 我在 pastebin 网站附上了我的废品来源。 elca.pastebin.com/m52e7d8e0目前有一些问题,非常感谢

标签: python parsing lxml


【解决方案1】:

一般来说,要解决此类问题,您必须首先以文本形式下载感兴趣的页面(使用 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>

等等。因此,您希望将&lt;dt&gt; 中的&lt;a&gt; 标记的内容作为“主题”,并将其后面的&lt;dd&gt; 标记的内容作为“内容”(在同一个&lt;dl&gt; 中)。

你得到的标题包含:

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 片段而不是 prints(例如将它们附加到一个列表中,当你拥有所有必需的部分时''.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中的逻辑,或者“lxml服装中的BeautifulSoup”,差别不大,只是各种导航操作的拼写和大小写有点变化。

【讨论】:

  • 您好,非常感谢您的辛勤工作!这几乎是我想要的 100%。另外,是否可以将 PAMIE 模块与我的脚本源一起使用?恐怕,我是否必须打开另一个新线程。谢谢
  • 嗨,我忘了,elca.pastebin.com/m52e7d8e0 这是我目前制作的爬虫脚本源。再次感谢
  • @Paul,我确实相信结束这个问题(接受最有帮助的答案)并在另一个问题上提出另一个问题是正确的礼仪:在一个问题中混合问题,因为它们彼此靠近在您的代码中没有帮助!
  • 您好,感谢您的建议.... :) 以及您的大力支持。我关闭这个问题....
  • @paul,我注意到你从不接受任何答案——即使 cmets &c 你似乎很欣赏它。答案的赞成数下方有一个复选标记图标:当您接受答案时,您和被回答的人都会获得一些声誉,并且复选标记变为纯绿色。基本的 SO 礼仪,真的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多