【发布时间】:2011-04-22 15:49:56
【问题描述】:
我正在努力学习python,我真的觉得“learn python the hardway”、“a byte of python”和“head first python”真的是很棒的书。然而——现在我想开始一个“真正的”项目,lxml 让我觉得自己像一个完整的 git。
这就是我想做的(目标)
我正在尝试解析一篇关于政治的报纸网站文章
网址是http://politiken.dk/politik/
最终的项目应该
- 1) 每天(也许每小时)访问 以上网址
- 2) 对于每个相关
文章,我想将网址保存到
数据库。相关文章是
在
<div class="w460 section_forside sec-forside">。一些元素有图像,一些元素 不要。
我想保存以下内容:
- a - 标题 (
<h1 class="top-art-header fs-26">) - b - 副标题 (
<p class="subheader-art">) c - 如果元素有对应的img,那么“alt”或“title”属性
3) 访问每个相关的 URL 并抓取文章正文并将其保存到数据库中。
- 4) 如果每个相关的 URL 都已经在数据库中,那么我跳过那个 URL(上面定义的相关文章总是最新发布的 10 篇)
所需的结果应该是带有字段的数据库表:
- art.i) ID
- art.ii) 网址
- art.iii) 标题
- art.iiii) 副标题
- art.iiiiii) img alt
- art.iiiiii) 文章正文。
- art.iiiiiii) 日期和时间(位于
<span class="date tr-upper m-top-2">中的字符串)
以上是我希望帮助完成的。由于屏幕抓取并不总是仁慈的,我想解释一下我为什么要这样做。
基本上我想挖掘数据以发现 议会或政党成员。我不会重新发布文章,出售数据或类似的东西(我没有检查我的方法的合法性,但希望并认为它应该是合法的)
我想我有一张政客桌和一张政党桌。
对于我将拥有的每个政治家:
- pol.i) ID
- pol.ii) 名字
- pol.iii) sur_name
- pol.iiii) 派对
对于我将拥有的每个政党:
- party.i) ID
- party.ii) 正确的名字
- party.iii) 主叫姓名 -party.iii) 缩写
我想对几家丹麦报纸网站执行此操作,然后分析是否有一份报纸 对某些政客/政党给予偏好 - 仅基于提及次数。
我也需要帮助来做这件事——但一步一步来:-)
稍后我想探索 NLTK 和情感挖掘的可能性。
我想看看这是否可以转化为博士学位。政治学/新闻学项目。
这基本上就是我所拥有的(即什么都没有)
我真的很难理解 lxml、元素的概念、不同的解析等。我当然已经阅读了教程,但我仍然很困惑。
import lxml.html
url = "http://politiken.dk/politik/"
root = lxml.html.parse(url).getroot()
# this should retur return all the relevant elements
# does not work:
#relevant = root.cssselect("divi.w460 section_forside sec-forside") # the class has spaces in the name - but I can't seem to escape them?
# this will return all the linked artikles headlines
artikler = root.cssselect("h1.top-art-header")
# narrowing down, we use the same call to get just the URLs of the articles that we have already retrieved
# theese urls we will later mine, and subsequently skip
retrived_urls=[]
for a in root.cssselect("h1.top-art-header a"):
retrived_urls.append(a)
# this works.
我希望从答案中得到什么
首先 - 只要你不叫我(非常糟糕的)名字 - 我会继续快乐。
- 但我真正希望的是对 lxml 工作原理的简单易懂的解释。如果我知道用于上述任务的工具,那么我真正“深入了解 lxml”会容易得多。也许是因为我的注意力持续时间短,当我阅读超出我理解水平的东西时,我什至不确定自己找对地方了。
- 如果您能提供任何适合某些任务的示例代码,那就太好了。我希望把这个项目变成博士。但我敢肯定这种事情一定已经做过一千次了?如果是这样,根据我的经验,向他人学习是变得更聪明的好方法。
- 如果您强烈认为我应该忘记 lxml 并使用例如。 scrapy 或 html5lib 那么请说 :-) 我开始研究 html5lib,因为 Drew Conway 在一篇关于政治科学家的 Python 工具的博客文章中建议,但我找不到任何介绍级别的材料。 alsp lxml 是 scraperwiki 的好人推荐的。根据scrapy,这可能是最好的解决方案,但我担心scrapy在很大程度上是一个框架——如果你知道你在做什么,并且想要快速完成它,那么它真的很好,但也许不是最好的方法学习 python 魔法。
- 我计划使用关系数据库,但如果您认为,例如mongo 会是一个优势,我会改变我的计划。
- 由于我无法在 python 3.1 中安装 import lxml,我使用的是 2.6。如果这是错误的 - 请也这样说。
时间范围
我问了一堆关于 stackoverflow 的初学者问题。太多了,值得骄傲。但是,有了一份全职工作,我似乎永远无法将自己埋在代码中,只吸收我渴望的技能。我希望这将是一个问题/答案,我可以回来重新学习并更新我学到的东西,并重新学习我忘记的东西。这也意味着这个问题很可能会在相当长的一段时间内保持活跃。但我会评论我可能有幸收到的每一个答案,并且我会不断更新“我得到了什么”部分。
目前我觉得我可能已经咬得比我能咀嚼的还多——所以现在又回到了“头先蟒蛇”和“艰难地学习蟒蛇”。
结束语
如果你已经走到了这一步 - 你很了不起 - 即使你没有回答这个问题。你现在已经阅读了很多简单、困惑和愚蠢的问题(我很自豪能提出这些问题,所以不要争论)。你应该喝杯咖啡和无过滤器的烟雾并祝贺你自己:-)
节日快乐(在丹麦,我们庆祝复活节,现在阳光明媚,就像纸浆小说中 Samual Jackson 的钱包一样)
编辑的
看来beutifulSoup 是个不错的选择。但是,根据开发人员的说法,如果我想使用 python3,BeautifulSoup 不是一个好的选择。但是根据this,我更喜欢python3(虽然不是很强烈)。
我还发现“潜入python 3”中有一个lxml章节。也会对此进行调查。
【问题讨论】:
-
对于 HTML 解析,BeautifulSoup 是一个更好的选择。理想情况下,每个人都会编写有效的标记,并且解析器几乎可以坚持标准(就像 lxml 那样)并完成。可悲的是,几乎没有人会费心去做,因此需要像浏览器中的解析器和 BeautifulSoup 中的解析器来或多或少地理解网站所包含的任何混乱的无效废话。
-
BeautifulSoup 是你的好朋友。
-
@delnan,lxml.html.soupparser 让您两全其美
-
感谢 delnan 和 RestRisiko。我认为 BeautifullSoup 又回到了正轨?我以为大多数人已经解散了 BeatufullSoup。我肯定会研究 BeautifulSoup(还有 lxml.html.soupparser - 谢谢 Mike!)
-
支持 BS 而不是 lxml 的 cmets 似乎是错误的,而且已经过时了......请参阅 Python Scraping Showdown - Katharine Jarmul,PyCon 2014
标签: python screen-scraping lxml