在Python 2.7中输出lxml

时间:2015-01-09 02:38:37

标签: python python-2.7 lxml lxml.html

这可能是一个完全愚蠢的问题,但谷歌无济于事。 首先当然是导入我需要的库:

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中,我已经尝试过Google的前20个lxml和请求链接,它们都输出相同的内容,但声称输出实际的html。我不知道发生了什么。

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

3 个答案:

答案 0 :(得分:2)

完成lxml.etreerequests教程应该有助于理解基础知识。

<Response [200]>

这是一个requests.Response对象,在这种情况下返回requests.get()调用。

<lxml.etree._ElementTree object at 0x2db0dd0>

这是parse()方法返回的ElementTree object

在这种情况下,

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对象的内容。

答案 1 :(得分: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
    

答案 2 :(得分:1)

如果您要查找HTML,则需要etree.tostring()。当您进行搜索时,您将获得元素列表,因此请单独打印每个元素。像这样:

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

或者,对于独特的项目:

print etree.tostring(friday[0])

docs are here。 <{1}},pretty_printmethod选项是最重要的。