Điều này khiến tôi hoàn toàn điên loạn, tôi đã phải vật lộn với nó trong nhiều giờ. Bất kì sự trợ giúp nào đều được đánh giá cao.Sử dụng lxml để phân tích cú pháp tên HTML?
Tôi đang sử dụng PyQuery 1.2.9 (được xây dựng trên đầu trang của lxml
) để cạo this URL. Tôi chỉ muốn có danh sách tất cả các liên kết trong phần .linkoutlist
.
Đây là yêu cầu của tôi đầy đủ:
response = requests.get('http://www.ncbi.nlm.nih.gov/pubmed/?term=The%20cost-effectiveness%20of%20mirtazapine%20versus%20paroxetine%20in%20treating%20people%20with%20depression%20in%20primary%20care')
doc = pq(response.content)
links = doc('#maincontent .linkoutlist a')
print links
Nhưng đó trả về một mảng trống. Nếu tôi sử dụng truy vấn này để thay thế:
links = doc('#maincontent .linkoutlist')
Sau đó, tôi quay trở lại này HTML này:
<div xmlns="http://www.w3.org/1999/xhtml" xmlns:xi="http://www.w3.org/2001/XInclude" class="linkoutlist">
<h4>Full Text Sources</h4>
<ul>
<li><a title="Full text at publisher's site" href="http://meta.wkhealth.com/pt/pt-core/template-journal/lwwgateway/media/landingpage.htm?issn=0268-1315&volume=19&issue=3&spage=125" ref="itool=Abstract&PrId=3159&uid=15107654&db=pubmed&log$=linkoutlink&nlmid=8609061" target="_blank">Lippincott Williams & Wilkins</a></li>
<li><a href="http://ovidsp.ovid.com/ovidweb.cgi?T=JS&PAGE=linkout&SEARCH=15107654.ui" ref="itool=Abstract&PrId=3682&uid=15107654&db=pubmed&log$=linkoutlink&nlmid=8609061" target="_blank">Ovid Technologies, Inc.</a></li>
</ul>
<h4>Other Literature Sources</h4>
...
</div>
Vì vậy, các bộ chọn cha mẹ làm trở HTML với nhiều <a>
thẻ. Đây cũng có vẻ là HTML hợp lệ.
Thử nghiệm khác cho thấy lxml không thích thuộc tính xmlns
trên div mở, vì một lý do nào đó.
Tôi làm cách nào để bỏ qua điều này trong lxml và phân tích cú pháp như HTML thông thường?
CẬP NHẬT: Đang cố gắng ns_clean
, vẫn thất bại:
parser = etree.XMLParser(ns_clean=True)
tree = etree.parse(StringIO(response.content), parser)
sel = CSSSelector('#maincontent .rprt_all a')
print sel(tree)
T hanks rất nhiều. Không quan tâm, bạn có thể cho tôi biết tại sao tôi đã nhìn thấy không gian tên này gắn liền với phần tử 'div'? Nó không có trong nguồn của trang. – Richard
@Richard câu hỏi tuyệt vời mà làm cho tôi nghĩ rằng không gian tên đã được chèn bởi pyquery kể từ khi nó đã cố gắng phân tích cú pháp nội dung với xml phân tích cú pháp, trong khi cần thiết để làm điều đó thông qua html parser, xin vui lòng xem bản cập nhật. Hy vọng rằng sẽ giúp. – alecxe
@alexce aha! cám ơn vì đã giải thích. – Richard