【问题标题】:Webscraping phonenumbers网页抓取电话号码
【发布时间】:2018-06-01 20:04:27
【问题描述】:

首先,我是一个编程新手,我的英语不是最好的。

我在 Windows 10 Pro 上使用 Python 3.6。

经过反复试验,我终于弄清楚了如何通过 lxml 从网页中抓取数据,以及如何使用 beautifulsoup 和 csv 将其添加到 Excel 工作表中。

到目前为止,这对我来说很有效。收集姓名、地址和距离列表非常容易。但是当我试图提取电话号码和电子邮件时,我遇到了麻烦。经过一番研究,我发现他们拆分了电话号码并对其进行了编码。电子邮件也有点棘手。

我要从中提取数据的网页是: https://www.gelbeseiten.de/schluesselfertigbau/bergheim,,,,,umkreis-50000

我发现电话号码的第一部分在这里:

<span class="nummer">(02271) 6 79</span>

他们把剩下的都藏在这里了:

<span class="suffix encode_me telSelector128028047679_2623072" data-telselector="telSelector128028047679_2623072" data-telsuffix="IDcw"> 70</span>

即使第一部分看起来很简单,我也不能像以前那样使用 lxml 来提取它。

所以我的问题是,初学者是否仍有可能提取电话号码和电子邮件?

或者我应该尝试从打印的 PDF 文件中删除这些数字吗?

【问题讨论】:

  • 我很难理解你的问题。您是否在问是否可以从 HTML 属性中提取数字?当然。试一试,告诉我们它是如何失败的 - 我们很乐意提供帮助!
  • 为了清楚起见,完整的电话号码应该是(02271) 6 79 70?
  • @M.T.是的。这就是我需要的方式
  • 更糟糕的是:下载的html中没有电话号码的最后一部分:它是通过DOM修改下载后用javascript编写的。这意味着您不能仅使用urllib.requestBeautifulSoup 直接获取它。换句话说,他们不希望您从机器人中使用他们的页面...
  • 你好 Serge,还有其他方法吗?与:import re with open('text.txt') as fp: lines = fp.read().split("\n") 我正在从“strg-a”复制的文本中获取一个列表,其中包含完整的数字。但我不知道如何过滤电话号码列表。我尝试了正则表达式,但我无法提供所需的模式...

标签: python csv web-scraping beautifulsoup lxml


【解决方案1】:

尝试以下解决方案来获取电话号码:

import requests
from lxml import html

source = html.fromstring(requests.get("https://www.gelbeseiten.de/schluesselfertigbau/bergheim,,,,,umkreis-50000").text)
phone_number = "".join([text_node for text_node in source.xpath('//li[@class="phone"]//text()') if text_node.strip()])
print(phone_number)

输出:

'(02271) 6 79 70'

【讨论】:

  • 或者,使用text_content 更简单一点:source.xpath('//li[@class="phone"]')[0].text_content().strip()
  • 是的,我也试过了,但得到了'(02271) 6 79\n\t\t\t\t 70'。也许输出看起来像我这边,因为我没有用requests真正测试它,而是用从浏览器复制的HTML示例开发工具...
  • 感谢您的快速响应。但我的输出看起来略有不同:“(02271)6 79(02181)27 0(02161)24 19(02131)66 67(02103)39 00(02173)2 04 7(02235)9 23 04(02232)4 23 (0157) 86 85 74(02181) 2 78 11(02181) 47 49 0(02202) 1 88(0211) 23 80(02235) 9 23 0" 我如何将它们分成一个列表?为什么缺少后缀(例如 70)?
  • @DanielHe,正如 cmets 中已经提到的,最后一位数字来自 JavaScript,并且提供的方法可能仅适用于静态页面。您可能需要使用 selenium 来处理动态内容...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多