我有一个html文件,网址分隔为br
个标记,例如
<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/>
请注意换行标记为<br/>
而非<br />
。 Scrapy能够解析并提取第一个URL但在此之后无法提取任何内容。如果我在斜线之前放置一个空格,它可以正常工作。 html格式不正确,但我在多个网站上看到了这个错误,并且由于浏览器能够正确显示它,我希望scrapy(或底层的lxml / libxml2 / beautifulsoup)也应该正确解析它。
答案 0 :(得分:3)
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中使用这个方法,你只需要写一个简单的(或复杂的)link extractor。
例如
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 ...
答案 1 :(得分:-1)
根据最新惯例的建议,只使用<br>
代码而不是<br/>
代码。