2015-01-09 4 views
2

Это может быть совершенно глупый вопрос, но google не имеет смысла. Во-первых, конечно, импортировать библиотеки мне нужно:Выход lxml в Python 2.7

from lxml import html 
from lxml import etree 
import requests 

достаточно просто. Теперь для запуска и анализа кода. Ссылка в этом случае - еженедельное обеденное меню для местного ресторана. Здесь мы готовим код для извлечения наших бит из него.

page = requests.get("http://www.farozon.se/lunchmeny-20207064") 
tree = html.fromstring(page.text) 
htmlparser = etree.HTMLParser() 
tree2 = etree.parse(page.raw, htmlparser) 

Теперь давайте посмотрим на меню! Как вы можете видеть, я тестирую несколько разных способов получения желаемого результата.

friday = tree.cssselect("#block_82470858 > div > div > div.h24_frame_personal_text.h24_frame_padding > div > table > tbody > tr:nth-child(4)") 
test = tree.xpath("/html/body") 

Давайте просто напечатаем вывод, чтобы узнать, что получилось.

print page 
print tree.cssselect('#block_82470858 > div > div > div.h24_frame_personal_text.h24_frame_padding > div > table > tbody > tr:nth-child(4)') 
print tree2 
print friday 
print test 

Ожидание возможности съесть некоторые ... Подождите, это не еда. Что это? В моей попытке выше и в моей IDE я пробовал 20 лучших ссылок Google для lxml и запросов, все они выводят одно и то же, но утверждают, что выводят фактический html. Я понятия не имею, что происходит.

<Response [200]> 
[<Element tr at 0x30139f0>] 
<lxml.etree._ElementTree object at 0x2db0dd0> 
[<Element tr at 0x30139f0>] 
[<Element body at 0x3013a48>] 
+0

попробуйте добавить '.text' на конце некоторых из ваших объектов ... – MattDMo

+0

я попробовал добавляя '.text' буквально в любом месте, он либо выводит то же, либо ошибку. Это мой первый проект python, поэтому, если у вас есть определенное место в памяти, пожалуйста, разделите. – Ruhpun

ответ

2

Прохождение lxml.etree и requests Учебники должны помочь с пониманием основ.

<Response [200]> 

Это requests.Response объекта, который возвращается, в данном случае - requests.get() вызова.

<lxml.etree._ElementTree object at 0x2db0dd0> 

Это ElementTree object возвращается методом parse().

tree.cssselect() и tree.xpath() в этом случае возвращают вам список экземпляров lxml.etree.Element, каждый элемент в списке соответствует HTML-элементу на странице.


Ниже приведен пример кода для извлечения элементов меню:

from lxml import html 
import requests 

page = requests.get("http://www.farozon.se/lunchmeny-20207064") 
tree = html.fromstring(page.text) 

days = tree.cssselect("#block_82470858 table tr")[1:-1] 
for item in days: 
    cells = item.findall('td') 
    day = cells[0].text_content().strip() 
    dishes = cells[-1].text_content().strip() 

    print day 
    print dishes 
    print "----" 

Печатает:

Måndag 
---- 
Tisdag 
---- 
Onsdag 
  Helstekt kalkonbröstfile med rödkål, gele 
  Panpizza med skinka,ananas,lök,bacon, vitkålssallad 
  
---- 
Torsdag 
 Ärtsoppa med fläsk, pannkaka, sylt, grädde 
 Köttfärslimpa pampas med gräddsås, lingonsylt 
... 

Как вы можете видеть, я использую text_content() метод для извлечения содержимого объект Element.

+0

Я думаю, что ваша кодировка немного выключена;) –

+0

Это довольно гениально. Если я правильно понял, вы сначала определяете дни как элемент html , начинающийся с [1], и переход на [-1] (последний элемент ?) Затем вы просматриваете все ячейки ( в html) и извлекаете день , а затем блюда, так как они находятся рядом друг с другом в тегах . И распечатать. – Ruhpun

+0

@PadraicCunningham Я не знаю этого языка, который знает, какие буквы у них есть :) (исправлено, спасибо) – alecxe

1

Если вы ищете HTML-код, вам необходимо etree.tostring(). Когда вы выполняете поиск, вы получаете списки элементов, поэтому распечатывайте их по отдельности. Как так:

for e in friday: 
    print etree.tostring(e) 

или, в случае уникальных предметов:

print etree.tostring(friday[0]) 

docs are here. Параметры pretty_print, method и with_tail являются наиболее важными.

2

Вы можете найти BeautifulSoup быть проще инструмент для использования:

import requests 
page = requests.get("http://www.farozon.se/lunchmeny-20207064") 
from bs4 import BeautifulSoup 

soup = BeautifulSoup(page.content) 
s = soup.find("div",attrs={"class":"h24_frame_personal_text h24_frame_padding"}).find("table").text 

print "\n".join(s.strip().splitlines()) 

Dagens v. 2 


Måndag 
  

   
  
  



Tisdag 
  

  
    
  



Onsdag 
  

  Helstekt kalkonbröstfile med rödkål, gele 
  Panpizza med skinka,ananas,lök,bacon, vitkålssallad 
  



Torsdag 
  

 Ärtsoppa med fläsk, pannkaka, sylt, grädde 
 Köttfärslimpa pampas med gräddsås, lingonsylt 
  



 Fredag 
  

 Brässerad skinkstek med äppelchutney 
 Nasi goreng med sweetchili creme 
  



  Lördag  
  10/1 
  
  

    


  




  Söndag 
    11/1 
     

+0

Вы получили право на кодировку, что делает мой шведский язык намного легче читать, но я уже часами сижу в darn lxml day, и было бы обидно, если бы я не смог заставить его работать. Я определенно вернусь к этому, если я не смогу использовать lxml так же красиво. Спасибо за ваше время. – Ruhpun

+0

@Ruhpun, не беспокойтесь, ответ alecxe лучше, лично я просто предпочитаю использовать beautifulSoup. –

+0

Да, если бы я мог выяснить, как получить вкусный Köttfärslimpa (мясной рулет) вместо KÃttttörslimpa (deadloaf). В любом случае я пойду с решением, тот факт, что вы вкладываете свое время в помощь мне, здорово, и я благодарю вас за это. – Ruhpun

Смежные вопросы