Python 2.7 如何使用非ASCII字符?
我正在使用Scrapy和XPath解析俄语网站 在本文中,我建议如何构造xpath表达式以获取值。但是,我不明白当参数名是俄语时如何处理 下面是xpath表达式: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
//*[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()
,等等,我只是从阅读别人的代码中学到的。:)