关于xpath:解决-xpath遇到特殊符号匹配不全信息的问题

这个问题是我之前的一个发问 通过了两三天的钻研终于解决了背景: import requestsfrom lxml import etree url = "https://music.163.com/discover/toplist?id=3779629" headers = { 'User-Agent': "PostmanRuntime/7.15.2", } response = requests.request("GET", url, headers=headers) ''' ”<”、”&” ''' r = etree.HTML(response.text) l = r.xpath("//textarea[@id='song-list-pre-data']/text()") print(l)最终输入(支只复制了最初一段):lLevel":"exhigh","pl":320000},"djid":0,"fee":0,"album":{"id":158052587,"name":"Sakana~( >ㅿㅿ\n']失常来说 这个xpath语句 是匹配到一个残缺的json模式数据 然而遇到了特殊符号 就在特殊符号处匹配完结了 导致信息拿不全 解决办法: 应用 bs4解析包(由查阅相干材料,stackoverflow 网评bs4比xpath在某些非凡场景更强壮) 并且留神soup = BeautifulSoup(response.text, "lxml") 的参数肯定不要应用 lxml 要应用 html.parser 最终代码: import requestsfrom bs4 import BeautifulSoupurl = "https://music.163.com/discover/toplist?id=3779629"headers = {'user-agent': "PostmanRuntime/7.15.2"}response = requests.request("GET", url, headers=headers)soup = BeautifulSoup(response.text, "html.parser")textarea = soup.find('textarea', attrs={'id': 'song-list-pre-data'}).get_text()print(textarea)最终输入能够拿到残缺的str用于json化 ...

January 19, 2023 · 1 min · jiezi

xpath匹配标签下面所有内容文字

在我们利用xpath匹配页面标签时,经常会遇到标签下面还包含标签,但是我们只想取下面的所有文字例如相匹配图中 div[@class='display-content']下面所有P的文字,此时我们可以利用这个方法 直接上代码 # 取正文def get_details(url): payload = "" headers = { 'Accept': "*/*", 'Accept-Encoding': "gzip, deflate", 'Accept-Language': "zh-CN,zh;q=0.9,en;q=0.8", 'Cache-Control': "no-cache", 'Connection': "keep-alive", 'Cookie': "SUV=1811281936496730; gidinf=x099980109ee0edb269b528280008252b495807e917b; _muid_=1548315571095387; IPLOC=CN4403; reqtype=pc; t=1557797597640; MTV_SRC=10010001", 'Host': "v2.sohu.com", 'Origin': "http://m.sohu.com", 'Pragma': "no-cache", 'Referer': "http://m.sohu.com/ch/8/?_f=m-index_important_hsdh&spm=smwp.home.nav-ch.1.1557825265945dy1ukUW", 'User-Agent': "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Mobile Safari/537.36", 'Postman-Token': "46314343-d211-4b4e-8d84-2b20462a5f54" } response = requests.request("GET", url, data=payload, headers=headers) text = etree.HTML(response.text) tt = text.xpath("//div[@class='display-content']") # print(tt) info = tt[0].xpath("string(.)") return info返回结果如图 ...

May 14, 2019 · 1 min · jiezi

xpath匹配一个标签下所有内容

from lxml import etreeimport requestsurl = ‘http://www.shihuo.cn/youhui/474770.html#qk=youhui_list'response = requests.get(url)text = etree.HTML(response.text)tt = text.xpath("//div[@class=‘article’]")info = tt[0].xpath(“string(.)”)

March 25, 2019 · 1 min · jiezi

Python爬虫笔记3-解析库Xpath的使用

当爬取到Html数据后,可以用正则对数据进行提取,但有时候正则表达式编写起来不方便,而且万一写错了,可能导致匹配失败。这时候就需要借助其他解析工具了。XML引入什么是XML?XML 指可扩展标记语言(EXtensible Markup Language)XML 是一种标记语言,很类似 HTMLXML 的设计宗旨是传输数据,而非显示数据XML 的标签需要我们自行定义。XML 被设计为具有自我描述性。XML 是 W3C 的推荐标准W3School官方文档:http://www.w3school.com.cn/xm…XML和HTML的区别语法要求不同在html中不区分大小写,在xml中严格区分。在HTML中,有时不严格,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略</p>或者</li>之类的结束标记。在XML中,是严格的树状结构,绝对不能省略掉结束标记。在XML中,拥有单个标记而没有匹配的结束标记的元素必须用一个/ 字符作为结尾。这样分析器就知道不用查找结束标记了。在XML中,属性值必须分装在引号中。在HTML中,引号是可用可不用的。在HTML中,可以拥有不带值的属性名。在XML中,所有的属性都必须带有相应的值。在XML文档中,空白部分不会被解析器自动删除;但是html是过滤掉空格的。设计目标不同XML被设计为传输和存储数据,其焦点是数据的内容。HTML显示数据以及如何更好显示数据。XML的节点关系1、父(parent)每个元素以及属性都有一个父。下面是一个简单的XML例子中,book 元素是 title、author、year 以及 price 元素的父:<?xml version=“1.0” encoding=“utf-8”?><book> <title>Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price></book>2、 子(Children)元素节点可有零个、一个或多个子。在下面的例子中,title、author、year 以及 price 元素都是 book 元素的子:<?xml version=“1.0” encoding=“utf-8”?><book> <title>Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price></book>3、 同胞(Sibling)拥有相同的父的节点在下面的例子中,title、author、year 以及 price 元素都是同胞:<?xml version=“1.0” encoding=“utf-8”?><book> <title>Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price></book>4、 先辈(Ancestor)某节点的父、父的父,等等。在下面的例子中,title 元素的先辈是 book 元素和 bookstore 元素:<?xml version=“1.0” encoding=“utf-8”?><bookstore><book> <title>Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price></book></bookstore>5、 后代(Descendant)某个节点的子,子的子,等等。在下面的例子中,bookstore 的后代是 book、title、author、year 以及 price 元素:<?xml version=“1.0” encoding=“utf-8”?><bookstore><book> <title>Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price></book></bookstore>Xpath什么是Xpath?Xpath,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言,可用来在 XML 文档中对元素和属性进行遍历。。最初是用来搜寻XML文档的,但是它也适用与HTML文档的搜索。所以在做爬虫时,可以使用XPath来做相应的信息抽取。W3School官方文档:http://www.w3school.com.cn/xp…Xpath开发工具开源的XPath表达式编辑工具:XMLQuire(XML格式文件可用)Chrome插件 XPath HelperFirefox插件 XPath Checker使用XpathXPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。1、Xpath常用规则表达式描述nodename选取此节点的所有子节点/从当前节点选取直接子节点//从当前节点选取子孙节点.选取当前节点..选取当前节点的父节点@选取属性2、Xpath使用示例以下面xmL文档为例:<?xml version=“1.0” encoding=“utf-8”?><bookstore><book> <title>Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price></book></bookstore>路径表达式结果bookstore选取bookstore元素的所有子节点/bookstore选取根元素bookstore。注:假如路径起始于正斜杠/,则此路径代表某元素的绝对路径bookstore/book选取属于bookstore的子元素的所有book元素//book选取所有book元素,不管在文档的任何位置bookstore//book选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。//@lang选取名为lang的所有属性lxml库使用lxml库安装lxml官网Github1、window安装cmd进入命令行模式,执行pip3 install lxml2、ubuntu16.04安装ctrl+alt+t进入终端模式,执行:sudo apt-get install -y build-essential libssl-devl libffi-dev libxml2-dev libxslt1-dev zlib1g-dev安装依赖的类库后,执行pip安装:sudo pip3 install lxml3、验证安装导入lxml模块,如果没有报错就安装成功。$ python3>>> import lxmletree模块使用 ...

February 22, 2019 · 1 min · jiezi

xpath获取标签属性乱码解决

问题在于解码和编码修改前的代码#-- coding: utf-8 --import requestsfrom lxml import etreeurl = ‘http://top.baidu.com/buzz?b=1&fr=20811'response = requests.get(url)r = etree.HTML(response.text)item_list = r.xpath("//table[@class=‘list-table’]//tr")# print(item_list)for i in item_list[1:]: first_name = i.xpath("./td[@class=‘first’]/span") keyword_name = i.xpath("./td[@class=‘keyword’]/a[@class=‘list-title’]") try: print(first_name[0].text) print(keyword_name[0].text) except: pass print(’’)打印输出 中文字全部为乱码1ÂêɯĸÇ×ÀϹ«³ö¹ì2ɱÓãµÜ¸¸×Ó´òÈË3·ÉÐÐÔ±Íü´øÔ¿³×4¿ì¹¸ß¹Ü±»ÅÐÎÞÆÚ5¶«º£º½¿ÕÔÙÏÖÎ¥¹æ6Ïȷ洴ʼÈËÈ¥ÊÀ7öª·æ·ñÈÏÇúÆæÖ°©8¹Â´æ6ɱ³Ô¼¦9IG 2:0 OMG10СS°®Çé±£ÏÊÊõ11Öйú0-2º«¹ú12Û¬ÁÖ¼¤¶¯Å­³â²ÃÅÐ13µÇ±´À³ÓëÕÅÁ¦ºÏÓ°14¼ÃÄÏÎ¥½¨±ðÊû±»²ð15ÎÞÏÞ¼« Ðļ¡Ëðº¦16â¹û»ØÓ¦Áõ»¶Í²Û17ÎâÒà·² 100Íò18Àî³ÐîçΪٶùÇìÉú19ħµÀ×æÊ¦±»Ëø20ÇжûÎ÷×â½èÒÁ¹ÏÒò21±´¿ËººÄ·°®È®22Æ»¹ûÊÐÖµ´óËõË®23×ß·¿´ÊÖ»ú·£10Ôª24¹ú¼ÊÓͼÛ×òÈÕÊÕÕÇ25¹ú×ãÂäºóº«¹ú26shadowÌæ²¹27ÉòÃγ½»ØÓ¦Âô¼Ù»õ28̨ÄÏŮͯÔâĸŰËÀ29Öк«´óÕ½Ê×·¢30ÖÐѧΪÀÏʦÉèÁµ°®¼Ù31ºú¾²ÆØ¹âºÀÃÅÉú»î32¹ËÍ¢ìÇҪȢÈçÀ¼33Ó¢¹úÒé»á·ñ¾öÍÑÅ·34¿ÏÄáÑǾƵ걬ը35µÎµÎ°²È«ÔÙÉý¼¶36ÖÜÐdzÛÕŰØÖ¥ÖؾÛ37Õã½­ÑØº£¸ßËÙ¿ªÍ¨38°×ÓîÐøÔ¼Ò¼ÐÄ39Ê®´ó×î¶Â»¥ÁªÍø¹«Ë¾40ÖܽÜÂ×ɹÂèÂè½üÕÕ41º®¼ÙÌìÊýÅÅÐаñ42°ëÊý·ÉÐÐÔ±ÍËÐÝ43ºã´óÂò¶Ï±£ÀûÄá°Â44лª±£ÏÕÍò·åÀëÖ°45ÐðÀûÑDZ¬Õ¨46º«¾ç¹¬½«ÅÄÖйú°æ47½ûֹδ³ÉÄêÈËÕûÈÝ48³ÂÒ⺭ÏëÂèÂè49Ê׸ÖÄÐÀº»÷°ÜÉϺ£50Ñî×ϹØÏþÍ® ÍÈ处理方式:先查看 response的编码print(response.encoding)然后对中文部分 encode(‘ISO-8859-1’).decode(‘gbk’)附上修改过后的代码和输出#-- coding: utf-8 --import requestsfrom lxml import etreeurl = ‘http://top.baidu.com/buzz?b=1&fr=20811'response = requests.get(url)print(response.encoding)r = etree.HTML(response.text)item_list = r.xpath("//table[@class=‘list-table’]//tr")# print(item_list)for i in item_list[1:]: first_name = i.xpath("./td[@class=‘first’]/span") keyword_name = i.xpath("./td[@class=‘keyword’]/a[@class=‘list-title’]") try: print(first_name[0].text.encode(‘ISO-8859-1’).decode(‘gbk’)) print(keyword_name[0].text.encode(‘ISO-8859-1’).decode(‘gbk’)) except: pass print(’**’)1玛莎母亲老公出轨2佘诗曼回应蛇精脸3杀鱼弟父子打人4飞行员忘带钥匙5快鹿高管被判无期6先锋创始人去世7东海航空再现违规8IG 2:0 OMG9济南大白宫被拆10济南违建别墅被拆11登贝莱与张力合影12无限极 心肌损害13孤存6杀吃鸡14霆锋否认曲奇致癌15中国0-2韩国16郜林激动怒斥裁判17小S爱情保鲜术18业主割断安全绳19芒果回应刘欢吐槽20吴亦凡 100万21李承铉为女儿庆生22魔道祖师被锁23伊瓜因发烧24切尔西租借伊瓜因25贝克汉姆爱犬26苹果市值大缩水27走路看手机罚10元28国际油价昨日收涨29国足落后韩国30shadow替补31沈梦辰回应卖假货32中韩大战首发33台南女童遭母虐死34中学为老师设恋爱假35胡静曝光豪门生活36顾廷烨要娶如兰37英国议会否决脱欧38肯尼亚酒店爆炸39滴滴安全再升级40周星驰张柏芝重聚41浙江沿海高速开通42十大最堵互联网公司43周杰伦晒妈妈近照44寒假天数排行榜45半数飞行员退休46恒大买断保利尼奥47新华保险万峰离职48韩剧宫将拍中国版49叙利亚爆炸50禁止未成年人整容 ...

January 17, 2019 · 1 min · jiezi