Python3中的刮擦链接

时间:2016-05-23 07:19:36

标签: python-3.x web-scraping

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:。不知道为什么。

请告诉我为什么会这样?

2 个答案:

答案 0 :(得分:1)

在HTML(和XML)中,&符号&用于分隔 HTML实体的开头,例如,字面值小于符号,<是表示为&lt;。如果未使用HTML实体,则HTML解析器会将小于号符号解释为 HTML标记的开头。

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

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

  

默认情况下,输出时转义的唯一字符是裸的   &符号和尖括号。这些变成了“&amp;”,“&lt;”和   “&gt;”,以便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做正确的事情。

答案 1 :(得分:0)

这是默认行为 - 来自docs

  

默认情况下,输出时转义的唯一字符是裸   &符号和尖括号。这些变为“&amp;”,“&lt;”,   和“&gt;”,这样美丽的汤不会无意中产生   无效的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=