这两天在研究Scrapy,在遇到用Xpath提出时,需要有Chrome的XPath helper,但老是出现错误。废话少说,还是先把测试网页保存到本地,逐步的测试提取。
测试文本text.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试-常规方法
</title>
</head>
<body>
<div id="content">
<ul id="useful">
<li>这是第一条信息
</li>
<li>这是第二条信息
</li>
<li>这是第三条信息
</li>
</ul>
<ul id="useless">
<li>不需要的信息1
</li>
<li>不需要的信息2
</li>
<li>不需要的信息3
</li>
</ul>
<div id="url">
<a href="http://jikexueyuan.com">极客学院
</a>
<a href="http://jikexueyuan.com/sourse/" title="极客学院课程库">点我打开课程库
</a>
</div>
</div>
<div id="test-0">大家好!
</div>
<div id="test-1">需要的内容1
</div>
<div id="test-2">需要的内容2
</div>
<div id="testfault">需要的内容3
</div>
<div id="tiger">
我左青龙,
<span id="tiger2">
右白虎,
<ul>
上朱雀,
<li>下玄武。
</li>
</ul>
老牛在当中,
</span>
龙头在胸口。
</div>
<div id="test-3">美女,
<font color=red>你的微信是多少?
</font>
</div>
</body>
</html>
使用XPath对相关内容的提取
from lxml import etree
f =
open(
'text.html',
'r',encoding=
"utf-8")
html = f.
read()
f.
close()
selector = etree.HTML(html)
selector.xpath提取后为list
#提取单个文本
content = selector.xpath('//
div[@id=
"test-0"]/text()')
print (content)
[‘大家好!’]
content = selector.xpath(
'//ul[@id="useful"]/li/text()')
print (content)
for each in content:
print (
each)
结果为: 这是第一条信息 这是第二条信息 这是第三条信息
link = selector.xpath(
'//a/@href')
for each in
link:
print (
each)
结果为: http://jikexueyuan.com http://jikexueyuan.com/sourse/
title = selector.xpath(
'//a/@title')
print (title[
0])
结果为: 极客学院课程库
# 以相同的字符开头 starts-
with(@属性名称,属性字符相同部分)
content =
selector.xpath(
'//div[starts-with(@id,"test")]/text()')
for each in content:
print (
each)
结果为: 大家好! 需要的内容1 需要的内容2 需要的内容3 美女,
data = selector.xpath(
'//div[@id="test-3"]')[
0]
info = data.xpath(
'string(.)')
info=str(
info)
content=
" ".join(
info.split())
print (content)
data = selector.xpath(
'//div[@id="tiger"]')[
0]
info = data.xpath(
'string(.)')
info=str(
info)
content=
" ".join(
info.split())
print (content)
结果为: 美女, 你的微信是多少? 我左青龙, 右白虎, 上朱雀, 下玄武。 老牛在当中, 龙头在胸口。
注:这里我将list转为str。网上有许多其他方法加extract()我尝试后,发现均出错。 另外,发现网上的代码有问题。
data = selector.xpath(
'//div[@id="test3"]')
info = data.xpath(
'string(.)').extract()[
0]
这样,就可以把“我左青龙,右白虎,上朱雀,下玄武。老牛在当中,龙头在胸口”整个句子提取出来,赋值给
info变量。
在IDE中直接测试
from lxml import etree
text=
"""
<div class=
"bd doulist-subject">
<div class=
"source">
来自:豆瓣读书
</div>
<div class=
"post">
<a href=
"https://book.douban.com/subject/10519369/" target=
"_blank">
<img width=
"100" src=
"https://img1.doubanio.com/lpic/s8869768.jpg">
</a>
</div>
<div class=
"title">
<a href=
"https://book.douban.com/subject/10519369/" target=
"_blank">
万物生光辉
</a>
</div>
<div class=
"rating">
<span class=
"allstar50"></span>
<span class=
"rating_nums">
9.4</span>
<span>(
738人评价)</span>
</div>
<div class=
"abstract">
"
作者: [英] 吉米·哈利
<br>
"
出版社: 中国城市出版社
<br>
"
出版年:
2012-
3
"
</div>
</div>
"""
selector = etree.HTML(text)
title = selector.xpath('
title=title[
0]
title=title.replace(
" ",
"").replace(
"\\n",
"").replace(
"\\r",
"")
title=title.strip()
print (title)
rate = selector.xpath('
rate=rate[
0]
rate=rate.replace(
" ",
"").replace(
"\\n",
"").replace(
"\\r",
"")
print (rate)
author = selector.xpath('
author=author[
0]
author=author.replace(
" ",
"").replace(
"\\n",
"").replace(
"\\r",
"").replace('
"',"")
author=author.strip()
print (author)
参考如下网页,非常感谢: http://blog.csdn.net/betabin/article/details/24392369 http://blog.csdn.net/skyeyesxy/article/details/50838003 http://blog.chinaunix.net/uid-13869856-id-5747417.html https://segmentfault.com/q/1010000006053119/a-1020000006053611
转载请注明原文地址: https://ju.6miu.com/read-662171.html