我正在使用Scrapy进行导入,但我在内部链接格式化方面遇到了麻烦。
采用以下HTML结构:
<div class="PageContent">
<a href="files/documents/path1.pdf">Click me</a>
<a href="files/documents/path2.pdf">Click me</a>
<a href="files/documents/path3.pdf">Click me</a>
</div>
XPath:
item["page_content"] = response.xpath("//div[@class='PageContent']".encode("ascii","ignore"))[0].extract().replace('\r','')
这很有效。我还检查了任何文件的响应,并下载它们。我已经自定义了FilesPipeline,以便保留其相对路径和名称,并且不会将其转换为GUID
pdf_urls = nodes.xpath(u'//a[@href[contains(., ".pdf")]]/@href'.encode("utf-8")).extract()
这也运作良好。
如果扩展名是.PDF,我需要修改item["page_content"]
并在HREF属性的前面和前面加一个字符串。我试过这个(和各种版本):
for attr in response.xpath(u'//a[@href[contains(., ".pdf")]]/@href'):
attr[href] = "/new/dir/in/front" + attr
没有成功。此外,即使我已成功修改此数据,如何阻止items["page_content"]
成为具有这些新属性的列表?我想要的结果是
items["page_content"] = <div class="PageContent">
<a href="/new/dir/in/front/files/documents/path1.pdf">Click me</a>
<a href="/new/dir/in/front/files/documents/path2.pdf">Click me</a>
<a href="/new/dir/in/front/files/documents/path3.pdf">Click me</a>
</div>
提前致谢
答案 0 :(得分:1)
好吧,我玩了一段时间,但我最终使用XML / HTML解析器来格式化我的数据。它更容易,更快,并提供更多的控制。为可能遇到类似问题的任何人发布此答案。
代码片段:
from lxml import html as HTML
from lxml import etree as ET
...
doc_pattern = ('//a[@href['
' contains(., ".pdf") or'
' contains(., ".dot") or'
' contains(., ".rtf") or'
' contains(., ".doc") or'
' contains(., ".xls") or'
' contains(., ".docx") or'
' contains(., ".xlsx")'
']]')
def parse_page_html(pattern,
response=response,
HTML=HTML,
ET=ET
):
parser = ET.HTMLParser(remove_comments=True, remove_blank_text=True)
content = response.xpath(pattern)[0].extract()
content = content.encode("ascii","ignore")
content = content.replace('\r','').replace('\n','').replace('\t','')
body = HTML.fromstring(content, parser=parser)
for links in body.xpath(doc_pattern):
links.attrib['href'] = remove_absolute_url( links.attrib['href'] )
...
content = ET.tostring(body)
return content
我之前从未做过这样的事情(并且使用了Python大约3个小时),但lxml让我进入了<45分钟。我最终重写了很多脚本以利用它,结果很棒。
答案 1 :(得分:0)
您是否尝试手动生成[&#34; page_content&#34;]项目?类似的东西:
items['page_content'] = []
for attr in response.xpath(u'//a[@href[contains(., ".pdf")]]/@href'):
items['page_content'].append("/new/dir/in/front" + attr)