Python 2.7 中 lxml 的输出

Output of lxml in Python 2.7

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

from lxml import html
from lxml import etree
import requests

很简单。现在运行并解析一些代码。本例中的 link 是当地餐馆的每周午餐菜单。在这里,我们准备从中提取位的代码。

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 的 lxml 和请求的前 20 links,它们都输出相同的东西,但声称输出实际的 html。我不知道发生了什么事。

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

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

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

或者,如果是唯一项目:

print etree.tostring(friday[0])

docs are herepretty_printmethodwith_tail 选项是最重要的。

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

<Response [200]>

这是一个 requests.Response 对象,由 return 编辑,在本例中 - requests.get() 调用。

<lxml.etree._ElementTree object at 0x2db0dd0>

这是 ElementTree object return 由 parse() 方法编辑的。

tree.cssselect()tree.xpath() 在这种情况下 return 你是一个 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 对象的内容。

您可能会发现 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