如何使用非ASCII字符?

时间:2014-05-08 08:31:44

标签: python-2.7 xpath non-ascii-characters

我正在使用 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表达式时没有任何结果。因此,我提供了有关我需要解析的网站的更多详细信息:

  1. 指向网站的链接:link to real-estate web site
  2. 我需要解析的截图:
  3. screen_shot

1 个答案:

答案 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])。但是,我认为除了编码之外,使用这种方法总体来说是更好的拼凑练习。

让我们知道您的想法。