使用python在LXML中进行屏幕抓取 - 提取特定数据

时间:2011-01-17 05:39:25

标签: python screen-scraping screen lxml web-scraping

我一直在努力编写最近几个小时的程序来完成我认为非常简单的任务:

  1. 程序要求用户输入(让我们说“幸福”类型)
  2. 程序使用此格式查询网站thinkexist(“http://thinkexist.com/search/searchQuotation.asp?search= USERINPUT ”)
  3. 程序返回网站的第一个引用。
  4. 我尝试过使用带有lxml的Xpath,但没有经验,每一个结构都带有一个空白数组。

    报价的实际内容似乎包含在“sqq。”类中。

    如果我通过Firebug导航网站,单击DOM选项卡,它出现在textNode属性“wholeText”或“textContent”中 - 但我不知道如何以编程方式使用该知识。

    有什么想法吗?

3 个答案:

答案 0 :(得分:6)

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()

...如果你输入'莎士比亚',它会返回

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.

答案 1 :(得分:1)

如果您没有必要通过XPath实现此功能,则可以使用BeautifilSoup这样的库(让myXml变量包含页面HTML源代码):

soup = BeautifulSoup(myXml)
for a in soup.findAll(a,{'class' : 'sqq'}):
  # this is your quote
  print a.contents

无论如何,阅读BS文档,它可能对一些不需要XPath功能的抓取需求非常有用。

答案 2 :(得分:1)

您可以打开html源代码,找出您要查找的确切类别。例如,要获取您可以执行的页面上遇到的第一个StackOverflow用户名:

#!/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