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

Python 如何使用lxml提取一些文本?,python,parsing,lxml,Python,Parsing,Lxml,我想在某个网站上提取一些文本。 这是我想提取一些文本来制作的网址。 在这个页面中,我想分别提取一些带有主题和内容字段的文本。 例如,如果您打开该页面,您可以在该页面中看到一些文本 日本东京国际电影节 美国环保署연합뉴스 세계 | 2009.10.25 (일) 오후 7:21 2009年10月25日,日本。Gayet因在法国电影制片人Xabi Molia执导的电影《八次飞跃》中的角色获得最佳女演员奖。EPA/DAI KUROKAWA 日本东京国际电影节 美国环保署연합뉴스 세계 | 2009.10

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

日本东京国际电影节 美国环保署연합뉴스 세계 | 2009.10.25 (일) 오후 7:21 2009年10月25日,日本。Gayet因在法国电影制片人Xabi Molia执导的电影《八次飞跃》中的角色获得最佳女演员奖。EPA/DAI KUROKAWA

日本东京国际电影节 美国环保署연합뉴스 세계 | 2009.10.25 (일) 오후 7:18 在第22届东京电影节的颁奖典礼上,她得知自己因在法国电影导演夏比·莫里亚的电影《八次飞跃》中扮演的角色而获得最佳女演员奖

等等,等等

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

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

主题:。。。 内容:

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

一般来说,要解决此类问题,您必须首先将感兴趣的页面作为文本下载(使用
urlib.urlopen
或其他任何工具,即使是curl或wget等外部实用程序,也不要使用浏览器,因为您希望在任何Javascript运行之前查看页面的外观)然后研究它以了解它的结构。在这种情况下,经过一些研究,你会发现相关的部分是(剪掉
标题中一些不相关的部分,并为了可读性而拆线)

因此,您还必须找到一种将编码解释为Unicode的方法——我相信编码也被称为
“euc_kr”
,我的Python安装似乎附带了一个编码解码器,但您也应该检查一下自己的编码

一旦您确定了所有这些方面,您将尝试
lxml.etree.parse
URL——就像许多其他网页一样,它不会解析——它不会真正呈现格式良好的HTML(请尝试w3c的验证程序,以了解它的一些破坏方式)

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

例如,这里有一个脚本,用于在该URL上发出前几个主题/内容对(它们当前已更改,最初与您给出的相同;-)。您需要一个支持Unicode输出的终端(例如,我在Mac的终端上毫无问题地运行此脚本。应用程序设置为utf-8)--当然,您可以不使用
打印
来收集Unicode片段(例如,将它们附加到列表中并
''。当您拥有所有所需片段时,将其加入
中),按照您的意愿对其进行编码,等等

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”并没有太大不同,只是各种导航操作的拼写和大小写发生了一些变化。

您能告诉我们您的尝试,以便我们看到您的问题所在吗?很抱歉,回复太晚,现在是凌晨。:)我在pastebin网站上附上了我的废品来源。目前有一些问题,谢谢你。你好,我真的很感谢你的努力!这几乎是我想要的100%。此外,有可能在我的脚本源中使用PAMIE模块吗?恐怕,我是否必须打开另一个新线程。谢谢,我忘了,这是我当前的making scraper脚本源代码。谢谢again@Paul,我相信结束这个问题(接受最有帮助的答案)并就你的另一个问题提出另一个问题是恰当的,所以礼节:将问题混合在一个问题中,因为它们在你的代码中彼此相邻,没有帮助!嗨,谢谢你的建议……)还有你的支持。我结束了这个问题。…@paul,我注意到你从不接受任何答案,即使通过评论和c你似乎很欣赏它。在答案的上票数下有一个复选标记形状的图标:当你接受一个答案时,你和被回答的人都会获得一些声誉,并且复选标记变成绿色。基本的哦,真的。
Content-Type: text/html; charset=ks_c_5601-1987
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)