这可能是一个完全愚蠢的问题,但谷歌无济于事。
首先,我需要导入库:
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>]
python大神给出的解决方案
通过lxml.etree
和requests
教程应该有助于理解基础知识。
<Response [200]>
这是一个requests.Response
对象,在这种情况下,该对象是requests.get()
调用返回的。
<lxml.etree._ElementTree object at 0x2db0dd0>
这是ElementTree
方法返回的parse()
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
对象的内容。