【问题标题】:Scraping links in Python3在 Python3 中抓取链接
【发布时间】:2016-05-23 07:19:35
【问题描述】:
import requests
from bs4 import BeautifulSoup

r = requests.get("http://www.forever21.com/IN/Product/Category.aspx? br=f21&category=top&pagesize=100&page=1")
soup = BeautifulSoup(r.content, "html.parser")
links = soup.find_all('a', href=True)
for link in links:
   if "BR=LOVE" in str(link):
      link = str(link)
      result = link[9:124]
      #if "VariantID=" in result:
       print((result))

上面的代码返回一个来自forever21.com 的链接列表。但问题在于:

http://www.forever21.com/IN/Product/Product.aspx?BR=LOVE21&Category=top&ProductID=2000183855&VariantID=

返回

http://www.forever21.com/IN/Product/Product.aspx?BR=LOVE21&amp:Category=top&amp:ProductID=2000183855&amp:VariantID=

请注意,它会在每个链接中自动将 & 替换为 &amp:。不知道为什么。

请告诉我为什么会这样?

【问题讨论】:

  • 您确定是&amp: 而不是&(带有分号)?

标签: python-3.x web-scraping


【解决方案1】:

在 HTML(和 XML)中,与符号 & 用于分隔 HTML 实体 的开头,例如,文字小于符号 < 表示为 @987654324 @。如果不使用 HTML 实体,HTML 解析器会将小于号解释为 HTML 标记的开头。

因为 & 符号用于表示 HTML 实体的开头,所以文字 & 本身由 & 表示。即使大多数 Web 浏览器通过将 & 视为文字来解决此类无效 HTML 实例,裸与符号(& 不表示 HTML 实体的开头)也不是有效的 HTML。

相比之下,BeautifulSoup 的目标是将写得不好的无效 HTML 转换为 有效 HTML,因此它通过将裸 & 符号转换为 & 来修复输入 HTML。这是documented behaviour

默认情况下,输出时唯一转义的字符是裸字符 和号和尖括号。这些会变成“&”、“”,这样 Beautiful Soup 就不会无意中生成无效的 HTML 或 XML:

soup = BeautifulSoup('<a href="http://example.com/?foo=val1&bar=val2">A link</a>')
soup.a
# <a href="http://example.com/?foo=val1&amp;bar=val2">A link</a>

拥有有效的 HTML 不是问题。自然,所有 HTTP 用户代理都会对转换后的 URL 做正确的事情。

【讨论】:

    【解决方案2】:

    这是默认行为 - 来自docs

    默认情况下,输出时唯一转义的字符是 bare 和号 和尖括号。这些变成“&amp;amp;”、“&amp;lt;”、 和“&amp;gt;”,这样 Beautiful Soup 就不会无意中生成 无效的 HTML 或 XML

    可能的解决方案

    可以通过为格式化程序提供一个值来改变这种行为 prettify()encode()decode() 的参数

    或者,简单地替换它(不是一个优雅的解决方案):

    result = link[9:124]
    result = re.sub(r'&amp;', r'&', result)
    print((result)
    

    )

    结果

    http://www.forever21.com/IN/Product/Product.aspxBR=LOVE21&Category=top&ProductID=2000183855&VariantID=
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-29
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多