【问题标题】:Webscraping in PythonPython 中的网页抓取
【发布时间】:2018-02-15 06:03:06
【问题描述】:

以下代码输出空列表;我希望它能打印股票价格。任何帮助将不胜感激。谢谢!

import urllib.request
import re
companyList = ["aapl","goog","nflx"]
for i in range(len(companyList)):

    url = "https://finance.yahoo.com/quote/"+companyList[i]+"?p="+companyList[i]
    htmlfile = urllib.request.urlopen(url)
    htmltext = htmlfile.read()
    regex = '<span class="Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)" data-reactid="35"><!-- react-text: 36 -->()(.+?)<!-- /react-text --></span>'
    pattern = re.compile(regex)
    price = re.findall(pattern, str(htmltext))
    print(price)

【问题讨论】:

  • 我看不出多次投反对票的意义,尤其是对于 SO 的新手。也许您可以告诉我们您要从该页面中提取的内容。同时,我建议您最好使用 BeautifulSoup 或其他处理网页的方法之一,而不是正则表达式。这种方法充满了困难。
  • 如果您想向我发送评论,请输入“@”符号以获取菜单并从列表中选择我的姓名。
  • 请不要使用正则表达式解析 HTML。您可以查看这个著名(或臭名昭著?)的问答了解详情:stackoverflow.com/questions/1732348/…
  • @BillBell 非常感谢您的建议。我第一次尝试 Webscraping,我正在关注的教程使用了正则表达式。我肯定会转向 BeautifulSoup 上的一个。 :)
  • @cddt 这个链接很有帮助。谢谢。

标签: python python-3.x web-scraping python-3.5 urllib


【解决方案1】:

我会为其中一家公司做这件事。但我希望你坚定承诺,你不会告诉任何人我已经向你展示了如何做到这一点。

获取页面的 HTML 副本并将其保存在本地。

>>> import urllib.request
>>> import re
>>> url = 'https://finance.yahoo.com/quote/AAPL/?p=AAPL'
>>> htmlfile = urllib.request.urlopen(url)
>>> htmltext = htmlfile.read()
>>> open('temp.htm', 'w').write(str(htmltext))
533900

检查页面,然后复制粘贴您希望能够在此页面和类似页面中识别的项目。将其放在评论中以供参考。

>>> # <span class="Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)" data-reactid="35"><!-- react-text: 36 -->161.38<

将其保存在变量中,例如exp

>>> exp = '<span class="Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)" data-reactid="35"><!-- react-text: 36 -->161.38<'

验证字符串中没有多个空白字符。如果有则用 \s+

替换整个空白字符串
>>> exp.find('  ')
-1

在字符串对正则表达式很重要的每个字符前加上单个“\”字符。

>>> re.sub(r'[().]', lambda m: '\\'+m.group(), exp)
'<span class="Trsdu\\(0\\.3s\\) Fw\\(b\\) Fz\\(36px\\) Mb\\(-4px\\) D\\(ib\\)" data-reactid="35"><!-- react-text: 36 -->161\\.38<'

显示结果并检查它。

>>> regex = '<span class="Trsdu\\(0\\.3s\\) Fw\\(b\\) Fz\\(36px\\) Mb\\(-4px\\) D\\(ib\\)" data-reactid="35"><!-- react-text: 36 -->([^<]+)<'

使用正则表达式查找目标项。

>>> re.findall(regex, str(htmltext))
['161.38']

【讨论】:

  • 你有我的话。非常感谢您的帮助。 :D
【解决方案2】:

看看下面的脚本是否有帮助。这也包括身份验证。

    https://github.com/PraveenKandregula/JenkinsRSSScrappingWithPython/blob/master/JenkinsRSSScrappingWithPython.py

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-12
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    相关资源
    最近更新 更多