我正在使用 Scrapy 和 XPath 来解析俄语网站。
在这个topic中,alecxe建议我如何构造xpath表达式来获取值。但是,当 Param1_name 是俄语时,我不明白如何处理此案例?
这是xpath表达式:
//*[text()="Param1_name_in_russian"]/following-sibling::text()
Html片段:
<div class="obj-params">
<div class="wrap">
<div class="obj-params-col" style="min-width:50%;">
<p>
<b>Param1_name_in_russian</b>" Param1_value"</p>
<p>
<strong>Param2_name_in_russian</strong>" Param2_value</p>
<p>
<strong>Param3_name_in_russian</strong>" Param3_value"</p>
</div>
</div>
<div class="wrap">
<div class="obj-params-col">
<p>
<b>Param4_name_in_russian</b>Param4_value</p>
<div class="inline-popup popup-hor left">
<b>Param5_name</b>
<a target="_blank" href="link">Param5_value</a></div></div>
根据评论编辑
我认为我没有正确指出问题,因为所有建议的解决方案对我都没有用,即当我在Scrapy控制台输出中测试建议的XPath表达式时没有任何结果。因此,我提供了有关我需要解析的网站的更多详细信息:
答案 0 :(得分:3)
考虑将文件开头的编码声明为latin-1
。有关原因的详细解释,请参阅documentation。
我将使用lxml
代替Scrapy
,但逻辑是相同的。
<强>代码:强>
#!/usr/bin/env python
# -*- coding: latin-1 -*-
from lxml import html
markup = """div class="obj-params">
<div class="wrap">
<div class="obj-params-col" style="min-width:50%;">
<p>
<b>Некий текст</b>" Param1_value"</p>
<p>
<strong>Param2_name_in_russian</strong>" Param2_value</p>
<p>
<strong>Param3_name_in_russian</strong>" Param3_value"</p>
</div>
</div>
<div class="wrap">
<div class="obj-params-col">
<p>
<b>Param4_name_in_russian</b>Param4_value</p>
<div class="inline-popup popup-hor left">
<b>Param5_name</b>
<a target="_blank" href="link">Param5_value</a></div></div>"""
tree = html.fromstring(markup)
pone_val = tree.xpath(u"//*[text()='Некий текст']/following-sibling::text()")
print pone_val
<强>结果:强>
['" Param1_value"']
[Finished in 0.5s]
请注意,由于这是一个unicode字符串,因此Xpath开头的u
是必要的,与问题中的@ warwaruk评论相同。
如果有帮助,请告诉我们。
修改强>
根据网站的标记,实际上有更好的获取价值的方法。再次,使用lxml
而不是Scrapy
,因为这两者之间的差异只是.extract()
。基本上,检查我的XPath 是否有名称,房间,方形和楼层。
import requests as rq
from lxml import html
url = "http://www.lun.ua/%D0%BF%D1%80%D0%BE%D0%B4%D0%B0%D0%B6%D0%B0-%D0%BA%D0%B2%D0%B0%D1%80%D1%82%D0%B8%D1%80-%D0%BA%D0%B8%D0%B5%D0%B2"
r = rq.get(url)
tree = html.fromstring(r.text)
divs = tree.xpath("//div[@class='obj-left']")
for div in divs:
name = div.xpath("./h3/span/a/text()")[0]
details = div.xpath(".//div[@class='obj-params-col'][1]")[0]
room = details.xpath("./p[1]/text()[last()]")[0]
square = details.xpath("./p[2]/text()[last()]")[0]
floor = details.xpath("./p[3]/text()[last()]")[0]
print name.encode("utf-8")
print room.encode("utf-8")
print square.encode("utf-8")
print floor.encode("utf-8")
这并不能完全打印出来(获得一些[Decode error - output not utf-8]
)。但是,我认为除了编码之外,使用这种方法总体来说是更好的拼凑练习。
让我们知道您的想法。