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 here。 pretty_print
、method
和 with_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
这可能是一个完全愚蠢的问题,但 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 here。 pretty_print
、method
和 with_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