2014-11-07 3 views
2

Я использую как xpath, так и beautifulsoup для очистки веб-страницы. Xpath требуется дерево в качестве входных данных и beautifulsoup нужен суп в качестве входных данных. Here're код, чтобы получить дерево и суп:store html in python

def get_tree(url): 
    r = requests.get(url) 
    tree = html.fromstring(r.content) 
    return tree 

# get soup 
def get_soup(url): 
    r = requests.get(url) 
    data = r.text 
    soup = BeautifulSoup(data) 
    return soup 

Оба этих метода использует requests.get (URL). Это то, что я хочу сохранить впереди. Вот код в Python:

import requests 
url = "http://www.nytimes.com/roomfordebate/2013/10/28/should-you-bribe-your-kids" 
r = requests.get(url) 
f = open('html','wb') 
f.write(r) 

А потом я получил ошибку вроде этого:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: must be convertible to a buffer, not Response 

Вот код, чтобы сохранить текст, и я получил сообщение об ошибке:

import requests 
from lxml import html 
url = "http://www.nytimes.com/roomfordebate/2013/02/13/when-divorce-is-a-family-affair" 
r = requests.get(url) 
c = r.content 
outfile = open("html", "wb") 
outfile.write(c) 
outfile.close() 
infile = open("html", "rb") 
tree = html.fromstring(infile) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Python/2.7/site-packages/lxml/html/__init__.py", line 662, in fromstring 
    start = html[:10].lstrip().lower() 
TypeError: 'file' object has no attribute '__getitem__' 

Как я могу это решить?

ответ

3
infile = open("html", "rb") #this is a file object Not a string 

Вы должны прочитать его первый с read(), а не просто открыть: -) -

infile = open("html", "rb") 
infile=infile.read() 
tree = html.fromstring(infile) 
0

request.get возвращает объект ответа.

Я думаю, что текст хочет писать. То, что вы хотите, - это содержимое ответа, которое также является текстом.

r = requests.get(url).content 
+0

Спасибо. Я все еще получаю ошибку при загрузке содержимого. См. Сообщение об обновлении. – f4fc2791e4473eb2ba41b5ddb445b2

0

fromstring() ожидает строку в качестве входного сигнала. Поскольку у вас есть файл, вам нужно использовать parse():

>>> tree = html.parse(infile) 
>>> tree.findtext('//title') 
When Divorce Is a Family Affair - Room for Debate - NYTimes.com