python - load_item - Scrapy: restrict_css con HTML mal formateado
scrapy robotstxt_obey (1)
El código HTML que trato de rastrear está mal formateado:
<html>
<head>...</head>
<body>
My items here...
My items here...
My items here...
Pagination here...
</body>
</head>
</html>
El problema es el segundo </head>
. Debo reemplazar el HTML en mi araña para usar las expresiones xpath:
class FooSpider(CrawlSpider):
name = ''foo''
allowed_domains = [''foo.bar'']
start_urls = [''http://foo.bar/index.php?page=1'']
rules = (Rule(SgmlLinkExtractor(allow=(''/?page=/d'',),),
callback="parse_start_url",
follow=True),)
def parse_start_url(self, response):
# Remove the second </head> here
# Perform my item
Ahora quiero usar el argumento restrict_xpath
en mi regla, pero no puedo porque el HTML está mal formateado: el reemplazo no se ha realizado en este momento.
¿Tienes una idea, por favor?
Lo que haría sería escribir un middleware de Downloader y usar, por ejemplo, el paquete BeautifulSoup
para corregir y embellecer el HTML contenido en response.body
- response.replace()
podría ser útil en este caso.
Tenga en cuenta que, si opta por BeautifulSoup
, elija un analizador con cuidado; cada analizador tiene su propio camino en el código HTML roto; algunos son menos o más indulgentes. lxml.html
sería el mejor en términos de velocidad.
Ejemplo:
from bs4 import BeautifulSoup
class MyMiddleware(object):
def process_response(self, request, response, spider):
soup = BeautifulSoup(response.body, "lxml")
response = response.replace(body=soup.prettify())
return response
Como ejemplo, de un middleware personalizado que modifica el HTML descargado, vea el middleware scrapy-splash
.