Screen scraping in LXML with python— extract specific data
在过去的几个小时里,我一直在尝试编写一个程序来完成我认为非常简单的任务:
我试过将xpath与lxml结合使用,但没有经验,而且每一个构造都返回一个空数组。
引用的实际肉似乎包含在类"sqq"中。
如果我通过Firebug导航该站点,单击dom选项卡,则引号似乎位于textNode属性"wholetext"或"textcontent"中,但我不知道如何通过编程使用该知识。
有什么想法吗?
1 2 3 4 5 6 7 8 9 10 11 12 | import lxml.html import urllib site = 'http://thinkexist.com/search/searchquotation.asp' userInput = raw_input('Search for: ').strip() url = site + '?' + urllib.urlencode({'search':userInput}) root = lxml.html.parse(url).getroot() quotes = root.xpath('//a[@class="sqq"]') print quotes[0].text_content() |
…如果你进入"莎士比亚",它就会回来
1 2 3 4 | In real life, unlike in Shakespeare, the sweetness of the rose depends upon the name it bears. Things are not only what they are. They are, in very important respects, what they seem to be. |
您可以打开HTML源代码来查找您要查找的确切类。例如,要获取页面上遇到的第一个stackoverflow用户名,可以执行以下操作:
1 2 3 4 5 6 7 8 9 10 11 12 | #!/usr/bin/env python from lxml import html url = 'http://stackoverflow.com/questions/4710307' tree = html.parse(url) path = '//div[@class="user-details"]/a[@href]' print tree.findtext(path) # -> Parseltongue # OR to print text including the text in children a = tree.find(path) print a.text_content() # -> Parseltongue |
如果您不需要通过xpath实现这一点,您可以使用这样的beautifilsoup库(让
1 2 3 4 | soup = BeautifulSoup(myXml) for a in soup.findAll(a,{'class' : 'sqq'}): # this is your quote print a.contents |
不管怎样,阅读BS文档,对于一些不需要xpath功能的抓取需求来说,它可能非常有用。