【问题标题】:regex and urllib.request to __scrape__ links from HTML正则表达式和 urllib.request 从 HTML 到 __scrape__ 链接
【发布时间】:2020-11-05 08:56:48
【问题描述】:

我正在尝试解析 HTML 以提取此正则表达式构造中的所有值: href="http//.+?"

这是代码:

import urllib.request
import re

url = input('Enter - ')
html = urllib.request.urlopen(url).read()
links = re.findall('href="(http://.*?)"',html)
for link in links:
    print(link)

但我收到一条错误消息: TypeError: 不能在类似字节的对象上使用字符串模式

【问题讨论】:

    标签: python regex html-parsing urllib


    【解决方案1】:

    urlopen(url) 返回一个字节对象。所以你的 html 变量也包含字节。您可以使用以下方式对其进行解码:

    htmlobject = urllib.request.urlopen(url)
    html = htmlobject.read().decode('utf-8')
    

    然后您可以在您的正则表达式中使用html,它现在是一个字符串。

    【讨论】:

      【解决方案2】:

      你的html是一个字节串,使用str(html)

      re.findall(r'href="(http://.*?)"',str(html))
      

      或者,使用字节模式:

      re.findall(rb'href="(http://.*?)"',html)
      

      【讨论】:

      • @TaufiqueRahman 很高兴听到这个消息,请点击左侧的灰色勾号。
      【解决方案3】:

      如果您想要页面上的所有链接,您甚至不必使用正则表达式。因为你可以只使用 bs4 来获得你需要的东西:-)

      import requests
      import bs4
      soup = bs4.BeautifulSoup(requests.get('https://dr.dk/').text, 'lxml')
      links = soup.find_all('a', href=True)
      [print(i['href']) for i in links]
      

      希望对您有所帮助。祝项目好运;-)

      【讨论】:

      • 谢谢@妈妈。我稍后会处理它。我刚刚开始在 python 中学习正则表达式来解析和所有。 bs4 将是下一章。
      猜你喜欢
      • 2011-04-28
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 2010-10-06
      • 1970-01-01
      • 2010-09-30
      相关资源
      最近更新 更多