【问题标题】:Help (or advice) me get started with lxml帮助(或建议)我开始使用 lxml
【发布时间】: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 - 标题 (&lt;h1 class="top-art-header fs-26"&gt;)
  • b - 副标题 (&lt;p class="subheader-art"&gt;)
  • 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) 日期和时间(位于&lt;span class="date tr-upper m-top-2"&gt; 中的字符串)

以上是我希望帮助完成的。由于屏幕抓取并不总是仁慈的,我想解释一下我为什么要这样做

基本上我想挖掘数据以发现 议会或政党成员。我不会重新发布文章,出售数据或类似的东西(我没有检查我的方法的合法性,但希望并认为它应该是合法的)

我想我有一张政客桌和一张政党桌。

对于我将拥有的每个政治家:

  • 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


【解决方案1】:

要阅读的内容很多 - 也许您可以分解成更小的具体问题。

关于 lxml,here 是一些例子。 official documentation 也非常好 - 花时间研究这些例子。而且邮件列表非常活跃。

关于 BeautifulSoup,lxml 是 more efficient,根据我的经验,它可以比 BeautifulSoup 更好地处理损坏的 HTML。缺点是 lxml 依赖于 C 库,因此更难安装。

【讨论】:

  • 来自“不再维护”链接:“本页最初写于2009年3月。此后发布了3.2系列,替换了3.1系列,并开发了4.x系列已经开始。此页面将出于历史目的而保留。请改用 3.2.0。”所以也许 beautifulSoup 没那么糟糕?
【解决方案2】:

lxml 绝对是当今 html 解析的首选工具。

这里有一个 lxml 备忘单,里面有很多你的答案:

http://scraperwiki.com/docs/contrib/python_lxml_cheat_sheet/

您编写的那批代码按原样运行,并在 ScraperWiki 编辑窗口中运行。 http://scraperwiki.com/scrapers/andreas_stackoverflow_example/edit/

通常链接的形式是: 标题

通过lxml解析后,您可以使用以下方法获取链接: a.attrib.get("href") 和文本使用 a.文本

但是,在这种特殊情况下,链接采用以下形式: 标题 所以值 a.text 只表示 '' 和第一个 '' 之间的字符。

但是您可以使用以下代码通过递归遍历子元素(在本例中为 )来将其展平:

def flatten(el):           
    result = [ (el.text or "") ]
    for sel in el:
        result.append(flatten(sel))
        result.append(sel.tail or "")
    return "".join(result)

【讨论】:

  • 谢谢朱利安。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2023-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
  • 2010-10-07
  • 2013-04-02
相关资源
最近更新 更多