lxml.html
разбирает нормально. Просто используйте это вместо встроенного HtmlXPathSelector.
import lxml.html as lxml
bad_html = """<a href="example.com/page1.html">Site1</a><br/>
<a href="example.com/page2.html">Site2</a><br/>
<a href="example.com/page3.html">Site3</a><br/>"""
tree = lxml.fromstring(bad_html)
for link in tree.iterfind('a'):
print link.attrib['href']
Результат:
example.com/page1.html
example.com/page2.html
example.com/page3.html
Поэтому, если вы хотите использовать этот метод в CrawlSpider, вам просто нужно написать простой (или сложный) экстрактор ссылок .
Например.
import lxml.html as lxml
class SimpleLinkExtractor:
extract_links(self, response):
tree = lxml.fromstring(response.body)
links = tree.xpath('a/@href')
return links
А затем используйте это в своем пауке ..
class MySpider(CrawlSpider):
name = 'example.com'
allowed_domains = ['example.com']
start_urls = ['http://www.example.com']
rules = (
Rule(SimpleLinkExtractor(), callback='parse_item'),
)
# etc ...