【问题标题】:Output of lxml in Python 2.7Python 2.7 中 lxml 的输出
【发布时间】:2015-03-07 07:53:55
【问题描述】:

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

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

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

【问题讨论】:

  • 尝试在某些对象的末尾添加.text...
  • 我已经尝试将.text 添加到任何我能做到的地方,它要么输出相同,要么输出错误。这是我的第一个 python 项目,所以如果你有一个特定的地方,请分享。

标签: python python-2.7 lxml lxml.html


【解决方案1】:

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

<Response [200]>

这是一个requests.Response 对象,在本例中是由requests.get() 调用返回的。

<lxml.etree._ElementTree object at 0x2db0dd0>

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


这是一个提取菜单项的示例代码:

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] 开始并转到 [-1] 的 html 元素(最后一个 元素?)然后循环遍历所有单元格(html 中的 ) 并提取日期,然后是菜肴,因为它们在 标记中彼此相邻。并打印。
  • @PadraicCunningham 我不懂那种语言,谁知道他们有什么字母:)(已修复,谢谢)
  • @Ruhpun 对,遍历tr 标签([1:-1] 在这里只是消除了第一行和最后一行 - 标题和最后一行 Veckans Sallad 行)。日和菜肴是从行内的td 元素中提取的。希望这很清楚。
【解决方案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
    

 

【讨论】:

  • 你确实得到了正确的编码,这让我的瑞典语更容易阅读,但我已经在该死的 lxml 日呆了好几个小时了,如果我做不到,那就太可惜了让它工作。如果我不能让 lxml 看起来很漂亮,我肯定会恢复到这个。谢谢你的时间。
  • @Ruhpun,不用担心,alecxe 的回答更好,我个人更喜欢使用 beautifulSoup。
  • 是的,如果我能弄清楚如何获得美味的 Köttfärslimpa(肉饼)而不是 Köttfärslimpa(死面包)。无论哪种方式,我都采用解决方案,您花时间帮助我这一事实很棒,对此我表示感谢。
  • @Ruhpun,试试page.text
  • @Ruhpun,或parser = html.HTMLParser(encoding=page.encoding) tree = html.fromstring(page.content, parser=parser)
【解决方案3】:

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

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

或者,对于独特的项目:

print etree.tostring(friday[0])

docs are herepretty_printmethodwith_tail 选项是最重要的。

【讨论】:

    猜你喜欢
    相关资源
    最近更新 更多
    热门标签