鱼C论坛

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

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

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

有下面这一串部分源代码,怎么样才能把telephone,mobile phone 号码提取出来,fax号码不要,最好用beautifulsoup,如果beautifulsoup不行的话,可以用XPATH按照这个原则设置最佳。
<div class="info-item">
       <div class="info-label">
        Telephone:
       </div>
       <div class="info-fields">
        86-574-86178908
       </div>
      </div>
      <div class="info-item">
       <div class="info-label">
        Mobile Phone:
       </div>
       <div class="info-fields">
        86-13777226846
       </div>
      </div>
      <div class="info-item">
       <div class="info-label">
        Fax:
       </div>
       <div class="info-fields">
        86-574-86176555
       </div>
      </div>

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

s = '''<div class="info-item">
       <div class="info-label">
        Telephone:
       </div>
       <div class="info-fields">
        86-574-86178908
       </div>
      </div>
      <div class="info-item">
       <div class="info-label">
        Mobile Phone:
       </div>
       <div class="info-fields">
        86-13777226846
       </div>
      </div>
      <div class="info-item">
       <div class="info-label">
        Fax:
       </div>
       <div class="info-fields">
        86-574-86176555
       </div>
      </div>'''
# soup
soup = BeautifulSoup(s, 'lxml')
result = soup.find_all(name='div', attrs={'class': 'info-fields'})
for i in result:
    print(i.string.strip())

# xpath
# html = etree.HTML(s)  # 将字符串转成etree对象
# result = html.xpath('//div[@class="info-fields"]/text()')
# for i in result:
#     print(i.strip())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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


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

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

哦对了正则表达式也不能用,因为会把fax的号码也提取出来
Traceback (most recent call last):
  File "D:\pythonProject\TEST\01.py", line 71, in <module>
    main()
  File "D:\pythonProject\TEST\01.py", line 68, in main
    data = find_data(res)
  File "D:\pythonProject\TEST\01.py", line 45, in find_data
    print(i.string.strip())
AttributeError: 'NoneType' object has no attribute 'strip'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

那把网页url发出来吧,我看看原始网页码源。
想知道小甲鱼最近在做啥?请访问 -> 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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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


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

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


if __name__ == '__main__':
    main()
想知道小甲鱼最近在做啥?请访问 -> 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'],,好奇怪啊,为什么呢
        headers = {
            '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',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
        res_new = requests.get(i, headers=headers)
        result = re.findall(r'\d\d-\d{3,11}-*\d{0,8}', res_new.text)[:2]
        print(result)
微信截图_20210509221459.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

浏览器会用javascript渲染页面,html结构会有所变动。而requests get拿到html后不会渲染html,所以可能会不一样。
建议你发一下原始网站URL,我帮你看看。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

原始网站需要登录才能看到电话号码,我应该怎么办???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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


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


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


if __name__ == '__main__':
    main()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

晚上发给你,希望不要用正则,正则我也可以爬出来,希望用telephone定位!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

使用道具 举报

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

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

import requests


def main():
    url = 'https://cnxinre.en.made-in-china.com/contact-info.html'
    headers = {
        '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==~@~',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
    r = requests.get(url, headers=headers)
    with open('r.txt', 'w', encoding='utf-8') as f:
        f.write(r.text)


if __name__ == '__main__':
    main()

r.rar

9.84 KB, 下载次数: 1

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-15 20:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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