抓取了一个网页,网页中一部分内容如下:
我使用如下代码:
import codecs
#coding=utf-8
from lxml import etree
f=codecs.open("1.html","r","utf-8")
content=f.read()
f.close()
tree=etree.HTML(content)
node=tree.xpath("//p[@class='content']")[0]
print node.text.encoding('gbk')
但是只能输出:奥迪阿萨德,第一个之后的内容都不能输出,请问该如何解决?
黄舟2017-04-17 13:11:53
lxml 的element.text
回傳的是這個元素第一個節點的內容,所以會出現這樣的問題。可以用getText
這個輔助方法來解決:
# require lxml
# version: python2
def getText(elem):
rc = []
for node in elem.itertext():
rc.append(node.strip())
return ''.join(rc)
這裡可以直接修改最後一行即可:
import codecs
#coding=utf-8
from lxml import etree
def getText(elem):
rc = []
for node in elem.itertext():
rc.append(node.strip())
return ''.join(rc)
f=codecs.open("1.html","r","utf-8")
content=f.read()
f.close()
tree=etree.HTML(content)
# 返回的是lxml.etree._Element,可以直接作为getText参数来调用。
node=tree.xpath("//p[@class='content']")[0]
print getText(node).encoding('gbk')
這裡的getText只是簡單的實現,例如下面的xml文字會列印abdc
,應該可以達到你的要求。
<p class="content">
a<em>b <em>d</em></em>c
</p>
巴扎黑2017-04-17 13:11:53
#!/usr/bin/env python3
from bs4 import BeautifulSoup
f = open("1.html", "r")
html = BeautifulSoup( f.read() )
node = html.select(".content")[0]
print( node.prettify() )
html.select(".content")
這個可能需要更多的選擇器限定一下。另外只是大概寫了下BeautifulSoup
如何運作的,具體需求可以查看手冊:Beautiful Soup 文件