Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 如何使用非ASCII字符?_Python 2.7_Xpath_Non Ascii Characters - Fatal编程技术网

Python 2.7 如何使用非ASCII字符?

Python 2.7 如何使用非ASCII字符?,python-2.7,xpath,non-ascii-characters,Python 2.7,Xpath,Non Ascii Characters,我正在使用Scrapy和XPath解析俄语网站 在本文中,我建议如何构造xpath表达式以获取值。但是,我不明白当参数名是俄语时如何处理 下面是xpath表达式: //*[text()="Param1_name_in_russian"]/following-sibling::text() Html代码段: <div class="obj-params"> <div class="wrap"> <div cla

我正在使用ScrapyXPath解析俄语网站

在本文中,我建议如何构造xpath表达式以获取值。但是,我不明白当参数名是俄语时如何处理

下面是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>


俄语“Param1_值”中的Param1_名称

俄语参数名称“参数值”

俄语参数3的名称“参数3的值”

russianParam4值中的参数名称

参数名称
根据评论编辑

我假设我没有正确指定问题,因为所有建议的解决方案对我都不起作用,也就是说,当我在Scrapy控制台输出中测试建议的XPath表达式时,什么都没有。因此,我提供了有关需要解析的网站的更详细信息:

  • 链接至网站:
  • 我需要解析的内容的屏幕截图:

  • 考虑将文件开头的编码声明为
    拉丁语-1
    。有关原因的详细解释,请参阅

    下面我将使用
    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在您的问题中的注释相同

    让我们知道这是否有帮助

    编辑:

    #!/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]
    
    基于站点的标记,实际上有一种更好的方法来获取值。同样,使用
    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")
    
    这并不能很好地将它们打印出来(得到一些
    [解码错误-输出不是utf-8]
    )。但是,我相信,除了编码之外,使用这种方法总体上是更好的抓取练习


    让我们知道您的想法。

    sel.xpath(u'/*[text()=“href=”text())/following sibling::text())
    (注意
    u'
    )不起作用?谢谢你的回复。不幸的是,它不起作用。你确定问题出在非ascii符号中,并且查询本身是正确的吗?你能提供一个示例URL或HTML片段吗?它可能需要使用一些
    normalize-space()
    ,即
    sel.xpath(u'/*[normalize space(.)=“Бцццццццццццц/以下同级::text()')
    。您也可以尝试
    sel.xpath(u'/*[规范化空间(.)=“\u041d\u0435\u043a\u0438\u0439\u0442\u0435\u043a\u0441\u0442”]/以下同级::text())
    请看编辑后的文章。我会按照你的建议尝试使用编码的非ascii符号。查看页面。为什么要用这种方式进行刮取?有一种更安全的方法。请看编辑。非常感谢你的回复!它帮了我很多忙:你建议使用lxml和工作示例。@M先生:不客气。我知道这离我是从什么开始的,但这对设置来说安全得多,特别是因为他们不通过JavaScript或类似的方式加载HTML。@Nаnashi:你能推荐一些xpath教程吗?我想提高我对这门语言的知识。好吧,你永远不会出错。很容易理解,参考风格非常简洁ear解释非常完美。诚然,我从未阅读过任何教程。大部分XPath是我自然学习的。其他的如
    包含
    last()
    ,等等,我只是从阅读别人的代码中学到的。:)