繁体   English   中英

Python 2.7中的lxml输出

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

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

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

<Response [200]>

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

<lxml.etree._ElementTree object at 0x2db0dd0>

这是由parse()方法返回的ElementTree对象

在这种情况下, 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对象的内容。

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

如果您正在寻找HTML,则需要etree.tostring() 搜索时,您会返回元素列表,因此请分别打印每个元素。 像这样:

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

或者,对于唯一项:

print etree.tostring(friday[0])

文档在这里 最重要的是pretty_printmethodwith_tail选项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM