Очистка экрана в LXML с помощью python - извлечение определенных данных - PullRequest
0 голосов
/ 17 января 2011

Последние несколько часов я пытался написать программу, которая, как мне показалось, была бы невероятно простой задачей:

  1. Программа запрашивает ввод пользователя (скажем, типа «счастье»')
  2. Программа запрашивает на сайте thinkexist, используя этот формат ("http://thinkexist.com/search/searchQuotation.asp?search=USERINPUT")
  3. Программа возвращает первую цитату с сайта.

Я пытался использовать Xpath с lxml,но не имеют опыта, и каждая отдельная конструкция возвращается с пустым массивом.

Фактическое содержание цитаты содержится в классе "sqq."

Если я перемещаюсь по сайту с помощьюFirebug, перейдите на вкладку DOM, кажется, что цитата находится в атрибуте textNode «wholeText» или «textContent» - но я не знаю, как использовать эти знания программно.

Есть идеи?

Ответы [ 3 ]

6 голосов
/ 17 января 2011
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 голос
/ 17 января 2011

Вы можете открыть исходный код 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
1 голос
/ 17 января 2011

Если вам не нужно реализовывать это через XPath, вы можете использовать библиотеку BeautifilSoup , например, такую ​​(пусть переменная myXml содержит исходный HTML-код страницы):

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

В любом случае, прочитайте документацию по BS, это может быть очень полезно для некоторых задач очистки, не требующих возможности XPath.

...