descrição da cena
Ao usar rastreadores Python, muitas vezes é necessário limpar os dados rastreados para filtrar o conteúdo desnecessário. A regularidade ( ) é frequentemente usada para limpeza de dados cujo resultado rastreado é textore.sub()
, mas para dados cujo resultado rastreado é HTML , se a regularização ainda for usada para limpeza de dados, geralmente obterá o dobro do resultado com metade do esforço , portanto, para rastreamento O resultado é HTM Como limpar os dados de L?
exemplo de código
# -*- coding: utf-8 -*-
import scrapy
import htmlmin
from lxml import etree
from lxml import html
from html import unescape
class TestSpider(scrapy.Spider):
name = 'test'
allowed_domains = ['www.gongkaoleida.com']
start_urls = ['https://www.gongkaoleida.com/article/869186']
# start_urls = ['https://www.gongkaoleida.com/article/869244']
def parse(self, response):
content = response.xpath('//article[@class="detail-info"]').getall()[0].replace('\n', '').replace('\r', '')
content = unescape(content)
tree = etree.HTML(content)
# 查找包含“公考雷达”的标签
str1 = tree.xpath('//p[contains(text(), "公考雷达")] | //a[contains(text(), "公考雷达")]/.. | //div[contains(text(), "公考雷达")]')
# 查找包含“附件:”或“附件:”或“常见office文件后缀”的标签
str2 = tree.xpath('//a[re:match(text(), "附件(\w+)?(:|:)") or re:match(text(), "(.doc|.xls|.ppt|.pdf)")]/..', namespaces={
"re": "http://exslt.org/regular-expressions"})
str3 = tree.xpath('//p[re:match(text(), "^(附件)(\w+)?(:|:)") or re:match(text(), "(.doc|.xls|.ppt|.pdf)")]', namespaces={
"re": "http://exslt.org/regular-expressions"})
str4 = tree.xpath('//span[re:match(text(), "附件(\w+)?(:|:)") or re:match(text(), "(.doc|.xls|.ppt|.pdf)")]/../..', namespaces={
"re": "http://exslt.org/regular-expressions"})
str5 = tree.xpath('//em[re:match(text(), "附件(\w+)?(:|:)") or re:match(text(), "(.doc|.xls|.ppt|.pdf)")]/../..', namespaces={
"re": "http://exslt.org/regular-expressions"})
# 查找href中包含gongkaoleida的标签
str6 = tree.xpath('//*[re:match(@href, "gongkaoleida")]', namespaces={
"re": "http://exslt.org/regular-expressions"})
# 数据清洗
for i in str1 + str2 + str3 + str4 + str5 + str6:
p1 = html.tostring(i)
p2 = unescape(p1.decode('utf-8'))
content = content.replace(p2, '')
# 压缩代码
content = htmlmin.minify(content, remove_empty_space=True, remove_comments=True)
print(content)
Aqui está
XPath + 正则
a maneira de fazê-lo!
Precauções
- Ao usar o método regular ( ) do XPath em lxml
re:match()
, ele precisa ser usado em conjunto com o namespace (namespaces={"re": "http://exslt.org/regular-expressions"}
), como:str6 = tree.xpath('//*[re:match(@href, "gongkaoleida")]', namespaces={ "re": "http://exslt.org/regular-expressions"})
- Não há necessidade de preencher o namespace ao usar o método regular ( ) do XPath no Scrapy , como:
re:match()
attachment_title_list = response.xpath('//a[re:match(text(), "(.doc|.xls|.ppt|.pdf)")]/text()').getall()