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&:Category=top&:ProductID=2000183855&:VariantID=
请注意,它会在每个链接中自动将&
替换为&:
。不知道为什么。
请告诉我为什么会这样?
答案 0 :(得分:1)
在HTML(和XML)中,&符号&
用于分隔 HTML实体的开头,例如,字面值小于符号,<
是表示为<
。如果未使用HTML实体,则HTML解析器会将小于号符号解释为 HTML标记的开头。
由于&符号用于表示HTML实体的开头,因此文字&
本身由&
表示。即使大多数Web浏览器通过将&
视为文字来解决此类无效HTML实例,因此裸露的&符号(&
不表示HTML实体的开头)是无效的HTML。
相比之下,BeautifulSoup的目标是将写得不好的无效HTML转换为有效的 HTML,以便通过将裸露的&符号转换为&
来修复输入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&bar=val2">A link</a>
拥有有效的HTML不是问题。当然,所有HTTP用户代理都会使用转换的URL做正确的事情。
答案 1 :(得分:0)
这是默认行为 - 来自docs:
默认情况下,输出时转义的唯一字符是裸 &符号和尖括号。这些变为“
&
”,“<
”, 和“>
”,这样美丽的汤不会无意中产生 无效的HTML或XML
可能的解决方案:
可以通过为格式化程序提供值来更改此行为
的参数prettify()
,encode()
或decode()
或者,简单地替换它(不是一个优雅的解决方案):
result = link[9:124]
result = re.sub(r'&', r'&', result)
print((result)
)
<强>结果强>:
http://www.forever21.com/IN/Product/Product.aspxBR=LOVE21&Category=top&ProductID=2000183855&VariantID=