鱼C论坛

 找回密码
 立即注册
查看: 4482|回复: 12

python爬虫遇到个小问题,希望大家帮一下

[复制链接]
发表于 2021-5-9 14:26:21 | 显示全部楼层 |阅读模式
30鱼币
本帖最后由 lizhiyong_11 于 2021-5-9 16:15 编辑

有下面这一串部分源代码,怎么样才能把telephone,mobile phone 号码提取出来,fax号码不要,最好用beautifulsoup,如果beautifulsoup不行的话,可以用XPATH按照这个原则设置最佳。
  1. <div class="info-item">
  2.        <div class="info-label">
  3.         Telephone:
  4.        </div>
  5.        <div class="info-fields">
  6.         86-574-86178908
  7.        </div>
  8.       </div>
  9.       <div class="info-item">
  10.        <div class="info-label">
  11.         Mobile Phone:
  12.        </div>
  13.        <div class="info-fields">
  14.         86-13777226846
  15.        </div>
  16.       </div>
  17.       <div class="info-item">
  18.        <div class="info-label">
  19.         Fax:
  20.        </div>
  21.        <div class="info-fields">
  22.         86-574-86176555
  23.        </div>
  24.       </div>
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-5-9 15:18:30 | 显示全部楼层
  1. from bs4 import BeautifulSoup
  2. from lxml import etree

  3. s = '''<div class="info-item">
  4.        <div class="info-label">
  5.         Telephone:
  6.        </div>
  7.        <div class="info-fields">
  8.         86-574-86178908
  9.        </div>
  10.       </div>
  11.       <div class="info-item">
  12.        <div class="info-label">
  13.         Mobile Phone:
  14.        </div>
  15.        <div class="info-fields">
  16.         86-13777226846
  17.        </div>
  18.       </div>
  19.       <div class="info-item">
  20.        <div class="info-label">
  21.         Fax:
  22.        </div>
  23.        <div class="info-fields">
  24.         86-574-86176555
  25.        </div>
  26.       </div>'''
  27. # soup
  28. soup = BeautifulSoup(s, 'lxml')
  29. result = soup.find_all(name='div', attrs={'class': 'info-fields'})
  30. for i in result:
  31.     print(i.string.strip())

  32. # xpath
  33. # html = etree.HTML(s)  # 将字符串转成etree对象
  34. # result = html.xpath('//div[@class="info-fields"]/text()')
  35. # for i in result:
  36. #     print(i.strip())
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-9 16:11:37 | 显示全部楼层
本帖最后由 lizhiyong_11 于 2021-5-9 16:18 编辑


你好实操过程中遇到了两个问题
1.因为我是上传了一部分源代码,用你的代码去查找所有的源代码的时候会报错(原因是搜索出了其余的东西)
2.不要fax号码,如果把fax代码也提出来的话,后面会很麻烦,因为fax号码是打不通的,总之筛选的时候就不能要fax号码

我有一些想法也许可以提供一些思路但是我不知道怎么实现:
可以通过节点的文本Telephone:来定位标签,那么这个标签的下一个兄弟标签的文本就是我们想要的数据了
其余同理

哦对了正则表达式也不能用,因为会把fax的号码也提取出来

  1. Traceback (most recent call last):
  2.   File "D:\pythonProject\TEST\01.py", line 71, in <module>
  3.     main()
  4.   File "D:\pythonProject\TEST\01.py", line 68, in main
  5.     data = find_data(res)
  6.   File "D:\pythonProject\TEST\01.py", line 45, in find_data
  7.     print(i.string.strip())
  8. AttributeError: 'NoneType' object has no attribute 'strip'
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-5-9 17:10:07 | 显示全部楼层
lizhiyong_11 发表于 2021-5-9 16:11
你好实操过程中遇到了两个问题
1.因为我是上传了一部分源代码,用你的代码去查找所有的源代码的时候会 ...

那把网页url发出来吧,我看看原始网页码源。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-9 17:32:26 | 显示全部楼层
本帖最后由 lizhiyong_11 于 2021-5-9 17:34 编辑
suchocolate 发表于 2021-5-9 17:10
那把网页url发出来吧,我看看原始网页码源。


见压缩包

test.rar

9.24 KB, 下载次数: 4

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-5-9 18:14:13 | 显示全部楼层

简单信息用re简单暴力:
  1. import re
  2. from lxml import etree


  3. def main():
  4.     # re解决
  5.     with open('test.txt', encoding='utf-8') as f:
  6.         html = f.read()
  7.         result = re.findall(r'\d\d-\d{3,11}-*\d{0,8}', html)[:2]
  8.         print(result)

  9.     # lxml解决
  10.     # html = etree.parse('test.txt', etree.HTMLParser())
  11.     # result = html.xpath('//div[@class="contact-info"]/div/div[@class="info-fields"]/text()')[4:6]
  12.     # for i in result:
  13.     #     print(i.strip())


  14. if __name__ == '__main__':
  15.     main()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-9 22:12:06 | 显示全部楼层
本帖最后由 lizhiyong_11 于 2021-5-9 22:16 编辑
suchocolate 发表于 2021-5-9 18:14
简单信息用re简单暴力:



下面是我的代码,用的你的正则表达式,只匹配出来了这个东西['98-2021'],源代码里面确实有这个数字,但是我只单独运行你的代码,结果确是正确的['86-574-86178908', '86-13777226846'],,好奇怪啊,为什么呢

  1.         headers = {
  2.             'Cookie': 'pid=zkuMTg5LjQ3LjI0OTIwMjEwNDI5MjExMzQzMjc3NjIzMjk2ODMM; webp=t; sf_img=AM; __pd=1f4es732u3e7; _skwd=29tX35Ib3BwZXIgRHJ5ZXJ+ISxjb21fflBsYXN0aWNzIERyeWVyfiEsY29tX35Ib3BwZXIY; _pd=zU1ODcwMDUyN; se=zkuMTg5LjQ2LjIxODIwMjEwNTA5MDkwODQzNjY5MzA2MDgyNTEM; dpr=1; prid=14114; cid=jAyMTA1MDkwOTE2MTU5NzQwMDA6MDE0OTgyMDI2OTQ1NDY3MzcyMDEM; sid=jc2MzMwMjIzNDI1MzQ4OTM6MzkuMTg5LjQ2LjIxODoxNzQ3MTc5NjE1OjAwM; cbid=Tc0NzE3OTYxNTowMAM; wel_name=GlqaXUb; loginSource=1; CPID=HCO0LGq54TeiECTodDZVlAA+sTjC7zrI; LOGT=Vz74ApnMt6WX7OfMdZNt7vNcgDl8hkUw; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22ovSfXTtDElVd_00%22%2C%22first_id%22%3A%221791dc38d0e978-002524cc5f97d9-3e604809-2764800-1791dc38d0f854%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%7D%2C%22%24device_id%22%3A%221791dc38d0e978-002524cc5f97d9-3e604809-2764800-1791dc38d0f854%22%7D; _cwd=pOdQnEWAJaVy_HwSxULEdCGWN_bNyxZRgjnmWT_JNGmnylAmUkf_JXknSWNCXVpE; hd_symbol=G9wcGVyIGRyeWVya; _kwd=HJvZF9+aG9wcGVyIGRyeWVyciEsfHJvZF9+aG9sbG93IG1ldGFsIGRvb3IciEsfHJvZF9+aW5kdXN0aWRhIGNoaWxsZXIciEsfHJvZF9+aG9wcGVyIGR5ZXIciEsfHJvZF9+aW5kdXN0cmlhbCBjaGlsbGVyc; _psl=yJmYyI6WyIzNCIsIjE5IiwiMTUiXX0e; lg=_~@~_~@~7X1gGfvOX/c3f+IS94wdYiN+PzD0t7ZE~@~7X1gGfvOX/e/B6j5FV5FXj7modlZY/lyuIBjykrprT8=~@~_~@~; JSESSIONID=8B70E9D4867F8FD68ADCBE05628F941B; LVT=dCwB46pc0Gd7y8Sd8dLz9uqoWFbEHhmH',
  3.             'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
  4.         res_new = requests.get(i, headers=headers)
  5.         result = re.findall(r'\d\d-\d{3,11}-*\d{0,8}', res_new.text)[:2]
  6.         print(result)
复制代码

微信截图_20210509221459.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-5-10 11:13:53 | 显示全部楼层
lizhiyong_11 发表于 2021-5-9 22:12
下面是我的代码,用的你的正则表达式,只匹配出来了这个东西['98-2021'],源代码里面确实有这个数字 ...

浏览器会用javascript渲染页面,html结构会有所变动。而requests get拿到html后不会渲染html,所以可能会不一样。
建议你发一下原始网站URL,我帮你看看。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-10 12:18:46 From FishC Mobile | 显示全部楼层
suchocolate 发表于 2021-5-10 11:13
浏览器会用javascript渲染页面,html结构会有所变动。而requests get拿到html后不会渲染html,所以可能会 ...

原始网站需要登录才能看到电话号码,我应该怎么办???
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-5-10 12:31:26 | 显示全部楼层
lizhiyong_11 发表于 2021-5-10 12:18
原始网站需要登录才能看到电话号码,我应该怎么办???


用这个代码把网页保存成文本r.txt,发给我。
  1. import requests


  2. def main():
  3.     url = 'xxx'
  4.     headers = {'user-agent': 'firefox'}
  5.     r = requests.get(url, headers=headers)
  6.     with open('r.txt', 'w', encoding='utf-8') as f:
  7.         f.write(r.text)


  8. if __name__ == '__main__':
  9.     main()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-10 17:09:35 From FishC Mobile | 显示全部楼层
suchocolate 发表于 2021-5-10 12:31
用这个代码把网页保存成文本r.txt,发给我。

晚上发给你,希望不要用正则,正则我也可以爬出来,希望用telephone定位!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-5-10 17:47:36 | 显示全部楼层
lizhiyong_11 发表于 2021-5-10 17:09
晚上发给你,希望不要用正则,正则我也可以爬出来,希望用telephone定位!

telephone并不是html的节点,而是节点的文本,这个定位起来比较麻烦。
程序都要考虑运算速度的,越简单越好。
xpath的话你可以参考上面,soup的话这个我没成功,你可以等等其他人回答。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-10 22:42:13 | 显示全部楼层
suchocolate 发表于 2021-5-10 17:47
telephone并不是html的节点,而是节点的文本,这个定位起来比较麻烦。
程序都要考虑运算速度的,越简单 ...

在你的代码里我传入了cooki,不然我觉得爬不出来电话号码


  1. import requests


  2. def main():
  3.     url = 'https://cnxinre.en.made-in-china.com/contact-info.html'
  4.     headers = {
  5.         'Cookie': 'pid=zkuMTg5LjQ3LjI0OTIwMjEwNDI5MjExMzQzMjc3NjIzMjk2ODMM; webp=t; sf_img=AM; __pd=1f4es732u3e7; _9755xjdesxxd_=32; YD00400313292638%3AWM_TID=oBAPhJGiOXJBFABERFMqw0LyrGJjRIWz; _skwd=29tX35Ib3BwZXIgRHJ5ZXJ+ISxjb21fflBsYXN0aWNzIERyeWVyfiEsY29tX35Ib3BwZXIY; _pd=zU1ODcwMDUyN; __snaker__id=PHNKgHygfVmcZtnd; _kwd=HJvZF9+aW5kdXN0cmlhbCBjaGlsbGVyciEsfHJvZF9+aW5kdXN0aWRhbCBjaGlsbGVyciEsfHJvZF9+aW5kdXN0aWRhIGNoaWxsZXIciEsfHJvZF9+aG9wcGVyIGRyeWVyciEsfHJvZF9+aG9sbG93IG1ldGFsIGRvb3IciEsfHJvZF9+aG9wcGVyIGR5ZXIc; _psl=yJmYyI6WyIzNCIsIjE0IiwiMTkiXX0e; se=mt1TVRnNUxqUTJMakl4T0RJd01qRXdOVEV3TURBd01UTTJOVFkwTVRNd016YzVOakFNe; dpr=1; JSESSIONID=0744E1C595B24557EE82A1318EBA6198; YD00400313292638%3AWM_NI=20Z2SoJnjFsM4F44o1Cf3AY6bMCCkQbZCTZWKB82icMuaXEuO%2FZUBdzNl69rrGwvy3gwh%2BicHMMdlY2zt1omNxQD6W4dsC9wqeBePg55iIbPMldza1o3uhkkxpTsgwWYdFY%3D; YD00400313292638%3AWM_NIKE=9ca17ae2e6ffcda170e2e6ee8cc77498b5bcb1ef4a85a88aa6d54e838b9abbf161f196fc99f447b7eaa1a4cd2af0fea7c3b92af2f096d3d2658ab2a6a7f247f89afcd5ee3b81bafda2dc3ea2938da4ea5ba2868db5d95d899ef8d3ec698fabafb9c87f8df196b6c170ba92a4d7bc7ab299b997fc39a5a9a8ccec698c938385ef53f2a6bcd2ee678ea89fa5b55df8bcbda4bc7db3bb8e86d36df7eba7aae15c8fb4ac9be43badedbb89ea61bcb09c94e67d9587aca7dc37e2a3; gdxidpyhxdE=yNnQ%2FLpUIkLgxddvt0TSX%5CxCYHwn%5CgRXx2ZbiEeAbLne2WirTwivdZwDd%2Frh2u9r3vzfehsw0dHhovbjWCnS1Ruqs32u9JRl2jbQw5AmC%2F51g0vhSOgNrjP2eLcruAcTV1Ox6zkl9%2B2Ki1NRcXwOvM%5ChBeRQqq4WuzCGgVrxrKJsBtil%3A1620657574881; cbid=Tc0NzEwMTk1NTowMAM; wel_name=TE4MTIzNTY4OEBxcS5jb20M; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22dXStEcfYYIWA_00%22%2C%22first_id%22%3A%221791dc38d0e978-002524cc5f97d9-3e604809-2764800-1791dc38d0f854%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%22%7D%2C%22%24device_id%22%3A%221791dc38d0e978-002524cc5f97d9-3e604809-2764800-1791dc38d0f854%22%7D; lg_name=1181235688%40qq.com; loginSource=1; cid=jAyMTA1MTAyMjMzMDEwNzUwMDA6MDEzNDIyMDIyNzcxNTMwMTQ2NjEM; sid=jc3NjY0MTU4NjgwNjE3NDI6MzkuMTg5LjQ2LjIxODoxNzQ3MTAxOTU1OjAwM; CPID=5rhRrB84hf0ZCF/Y79S5tiJ1YnXX/z4o; LOGT=5rhRrB84hf1/bbFUvf+HYHKRDV8cDDWl; LVT=yRk9xXiNxgB8jZTfY4buBqbogHylJc5P; lg=dO+c3EvwP7yJO8mRpML7HGE2XU/c0mIYfH7HaPiHaYM=~@~/e85XQKQwfmz/cCmsRSwiA==~@~3RHP0/5zale+YAOq+BomdaHhLki2hkGR~@~3RHP0/5zaldZ5hwCSRQJCflsg2VlwIQfQbp4JOgLj8o=~@~/e85XQKQwfnX9ZvQcnYS8A==~@~',
  6.         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
  7.     r = requests.get(url, headers=headers)
  8.     with open('r.txt', 'w', encoding='utf-8') as f:
  9.         f.write(r.text)


  10. if __name__ == '__main__':
  11.     main()
复制代码

r.rar

9.84 KB, 下载次数: 1

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-24 00:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表