2016-05-23 3 views
1
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. Но проблема в том, вместо:Скребковые ссылки в Python3

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: в каждом звене. Не знаю, почему.

Просьба сообщить мне, почему это происходит?

+0

Вы уверены, что это '& amp:', а не '&' (с точкой с запятой)? –

ответ

0

Это поведение по умолчанию - от docs:

По умолчанию только символы, которые убежали на выходе являются голые амперсанды и угловые скобки. Они заводятся в «&», «<», и «>», так что Beautiful Soup случайно не генерировать недопустимый 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= 
+0

Спасибо всем :) Его работа сейчас –

0

В HTML (и XML), амперсанд, & используется для того, чтобы разграничить начало Объекты HTML, например, буква меньше, чем символ, < представленный как &lt;. Если объект HTML не используется, анализатор HTML интерпретирует символ меньшего размера как начало HTML-тега .

Поскольку амперсанд используется для обозначения начала объекта HTML, буква & сама представлена ​​&amp;. Голый амперсанд (&, который не обозначает начало HTML-объекта) недействителен HTML, даже если большинство веб-браузеров работают над такими экземплярами недействительного HTML, обрабатывая & как литерал.

В отличие от этого, цель BeautifulSoup заключается в преобразовании плохо написанный недопустимый HTML в действительный HTML, так что фиксирует ввод HTML путем преобразования босые амперсандов в &amp;.Это 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-адресами.