【问题标题】:Scraping page returning slashes in tags using BeautifulSoup and python使用 BeautifulSoup 和 python 抓取页面返回标签中的斜线
【发布时间】:2020-03-11 15:23:24
【问题描述】:

我正在抓取this page 作为捕获页面上每个“连续 leyendo”链接的第一步。当我使用 Inspect Element 查看 html 时,我发现我需要针对所有

class = "small-link"

但是当我用 BeautifulSoup 抓取它时,页面实际上将它返回为

class=\"small-link\"

使用 curl -i https://www.gob.mx/presidencia/es/archivo/articulos?filter_id=5169&filter_origin=archive&idiom=es&page=1

我看到的页面是:

Content-Type: text/javascript; charset=utf-8

我尝试了以下方法,但它仍然返回转义字符:

soup = BeautifulSoup(site.content, "html.parser", from_encoding='utf-8')

关于如何获得正确编码返回的任何建议?

【问题讨论】:

    标签: python web-scraping encoding beautifulsoup


    【解决方案1】:

    以下代码为我解析了没有所有反斜杠的页面:

    import bs4
    import urllib2
    request = urllib2.Request('https://www.gob.mx/presidencia/es/archivo/articulos?filter_id=5169&filter_origin=archive&idiom=es&page=1')
    request.add_header('Accept-Encoding', 'utf-8')
    response = urllib2.urlopen(request)
    soup = bs4.BeautifulSoup(response)
    

    取自这篇文章: How to correctly parse UTF-8 encoded HTML to Unicode strings with BeautifulSoup?

    【讨论】:

    • 我不断收到“ModuleNotFoundError: No module named 'urllib2'...我正在使用 python 3.7
    • 拍摄...我实际上正在使用python 2-您是否安装并导入了urllib2pip install urllib2
    • 看起来 urllib2 不适用于 python3...说它已被拆分为不同的函数 docs.python.org/2/library/urllib2.html
    • 我无法让它在 python3 环境中工作......但是有一个 urllib3 应该适用于 python3 - 命令 urllib3.request 应该工作 - 我希望有帮助 - 抱歉我不能做更多
    • 在 Python 3 中,urllib2 已替换为 urllib.requesturllib3 是第三方库。
    【解决方案2】:

    您也可以使用requests 模块(pip3 install requests):

    import requests
    from bs4 import BeautifulSoup as soup
    d = soup(requests.get('https://www.gob.mx/presidencia/es/archivo/articulos?filter_id=5169&filter_origin=archive&idiom=es&page=1').text, 'html.parser')
    result = [{'img':i.div.img['src'], 'time':i.time.text, 'text':i.h2.text, 'link':i.a['href']} for i in d.find_all('article')]
    

    要获取链接,您可以遍历 result 并访问每个链接的 link 键。链接是相对的,所以要创建完整的 URL,你可以使用urllib.parse:

    import urllib.parse
    base = 'https://www.gob.mx/presidencia/es/archivo/articulos?filter_id=5169&filter_origin=archive&idiom=es&page=1'
    links = [urllib.parse.urljoin(base, i['link']) for i in result]   
    

    输出:

    ['https://www.gob.mx/presidencia/es/articulos/version-estenografica-de-la-conferencia-de-prensa-matutina-jueves-14-de-noviembre-2019?idiom=es', 'https://www.gob.mx/presidencia/es/articulos/version-estenografica-de-la-conferencia-de-prensa-matutina-miercoles-13-de-noviembre-2019?idiom=es', 'https://www.gob.mx/presidencia/es/articulos/version-estenografica-de-la-conferencia-de-prensa-matutina-martes-12-de-noviembre-2019?idiom=es', 'https://www.gob.mx/presidencia/es/articulos/version-estenografica-de-la-conferencia-de-prensa-matutina-lunes-11-de-noviembre-2019?idiom=es', 'https://www.gob.mx/presidencia/es/articulos/version-estenografica-dialogo-con-los-pueblos-maya-peninsular-ch-ol-tsotsil-tseltal-y-poblacion-indigena-migrante-desde-calakmul?idiom=es', 'https://www.gob.mx/presidencia/es/articulos/version-estenografica-dialogo-con-el-pueblo-maya-peninsular-y-poblacion-indigena-migrante-desde-felipe-carrillo-puerto?idiom=es', 'https://www.gob.mx/presidencia/es/articulos/version-estenografica-dialogo-con-el-pueblo-maya-peninsular-desde-temozon?idiom=es', 'https://www.gob.mx/presidencia/es/articulos/version-estenografica-dialogo-con-el-pueblo-maya-peninsular-desde-tekax-de-alvaro-obregon?idiom=es', 'https://www.gob.mx/presidencia/es/articulos/version-estenografica-de-la-conferencia-de-prensa-matutina-viernes-8-de-noviembre-2019?idiom=es']
    

    【讨论】:

      【解决方案3】:

      我使用了适用于 python 3.7 的 urllib3 您可以在userguide中找到详细信息

      import urllib3
      http = urllib3.PoolManager()
      request = http.request('get', 'URL-HERE')
      soup = BeautifulSoup(request.data,"html.parser")
      

      【讨论】:

        猜你喜欢
        • 2013-01-29
        • 2014-12-17
        • 2015-06-07
        • 1970-01-01
        • 1970-01-01
        • 2021-10-13
        • 2020-07-16
        • 2018-01-19
        • 1970-01-01
        相关资源
        最近更新 更多