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

时间:2009-10-25 17:01:57

标签: python parsing lxml

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

JAPAN TOKYO INTERNATIONAL FILM FESTIVAL     EPA연합뉴스세계| 2009.10.25(일)오후7:21     日本,2009年10月25日.Gayet因其在法国电影制作人Xabi Molia执导的电影“八次大报”中的角色而获得最佳女演员奖。 EPA / DAI KUROKAWA

JAPAN TOKYO INTERNATIONAL FILM FESTIVAL     EPA연합뉴스세계| 2009.10.25(일)오후7:18     她得知她在第22届东京颁奖典礼上因电影“八次以上”电影中的角色获得最佳女演员奖......

依此类推,,,,

最后我想提取像格式

这样的文字

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

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

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

1 个答案:

答案 0 :(得分: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>标记的内容为“内容”{在同一{{1} })。

您收到的标题包含:

<dl>

因此您还必须找到一种方法将该编码解释为Unicode - 我相信编码也称为Content-Type: text/html; charset=ks_c_5601-1987 ,我的Python安装似乎附带了编解码器,但您应该检查一下,太

一旦确定了所有这些方面,就会尝试'euc_kr'网址 - 而且,就像许多其他网页一样,它不会解析 - 它实际上并不是很好HTML(尝试使用w3c的验证器来了解它的一些破坏方式)。

由于格式错误的HTML在网络上如此常见,因此存在“容忍解析器”,试图弥补常见错误。在Python中最流行的是BeautifulSoup,事实上lxml带有它 - 使用lxml 2.0.3或更高版本,你可以使用BeautifulSoup作为底层解析器,然后继续“就好像”文档已正确解析 - 但我发现它更容易直接使用BeautifulSoup。

例如,这是一个脚本,用于发出该URL的前几个主题/内容对(它们当前已更改,最初它们与您给出的相同;-)。你需要一个支持Unicode输出的终端(例如,我在Mac的Terminal.App设置为utf-8时运行它没有问题) - 当然,除了lxml.etree.parse之外你还可以收集Unicode片段(例如,将它们附加到列表中,当你拥有所有必需的部分时,将它们print),然后根据需要对它们进行编码等等。

''.join

lxml中的逻辑,或“lxml服装中的BeautifulSoup”,并没有太大的不同,只是各种导航操作的拼写和大小写有所改变。