2016-08-02 13 views
-1

각 스레드의 회신 수를 등록하면서이 mailing list의 모든 제목을 추출하려고합니다. 모든 제목을 포함 방화범 상기 <ul>로는 XPath에 따르면 Scrapy는 Firebug가 나열한 "tbody"및 "ul"요소를 식별 할 수 없습니다.

은 :

/HTML/바디/[표 2]/TBODY/TR 1/TD [2]/표/TBODY/TR/TD/UL 내가 직접 Scrapy 쉘이 붙여 넣을 경우

그러나, 빈 목록을 얻을 것입니다 : 시행 착오 후

scrapy shell http://seclists.org/fulldisclosure/2002/Jul/index.html 
response.xpath('/html/body/table[2]/tbody/tr[1]/td[2]/table/tbody/tr/td/ul') 
[] 

를 (I 이후 주어진 Selector의 즉각적인 하위 요소를 나열하는 방법을 문서에서 찾아 낼 수 없다는 것을 알 수 있습니다. (내가 알고 있다면 알려주십시오.) Xpath에서 "tbody"요소가 작동하지 않는다는 것을 알았습니다.

almost_email_threads = response.xpath('/html/body/table[2]/tr[1]/td[2]/table/tr/td') 

그러나, 나는 도달 "UL"지금하려고하면 작동하지 않습니다 : 그들을 제거함으로써, 내가 /td까지 탐색 할 수 있었다 지금

email_threads.xpath('/ul') 
[] 

를, 무엇을 나에게 가장 혼란 그 실행은 다음과 같습니다

response.xpath('/html/body/table[2]/tr[1]/td[2]/table/tr/td//ul') 

하지만 웹 사이트에 나타나는와 같은 순서, 나에게 UL의의를 제공 할 것입니다. 스레드를 건너 뛰고 다른 순서로 건너 뜁니다. 또한 스레드 당 응답량을 계산할 수없는 것처럼 보입니다.

무엇이 여기에 있습니까? 내가 Scrapy를 사용해 본지 꽤 오래되었지만, 알아 내기가 어렵다는 것을 기억하지 못하고 어떤 이유로 든 Bing이나 Google에서 나에게 도움이되지 않는 튜토리얼을 생각해보십시오.

답변

-2

내가 방화범을 사용한 적이 있지만, 당신이 참조하는 HTML 페이지를보고, 나는 다음과 같은 XPath 식 당신에게 모든 최상위 스레드 줄 것이라고 말하고 싶지만 :

//li[not(ancestor::li) and ./a/@name] 

각 목록 요소에서 시작을, 당신 주어진 스레드에 대한 응답의 양을 얻기 위해리스트의 자식의 수를 세는 것이 필요하다. Scrapy 쉘을 사용

,이 결과 : 주어진 선택의 모든 하위 요소를 나열하는 방법에 대한 질문에 대해서는

> scrapy shell http://seclists.org/fulldisclosure/2002/Jul/index.html 
In [1]: threads = response.xpath('//li[not(ancestor::li) and ./a/@name]') 
In [2]: for thread in threads: 
    ...:  print thread, len(thread.xpath('descendant::li')) 
<Selector xpath='//li[not(ancestor::li) and ./a/@name]' data=u'<li><a name="0" href="0">Testing</a> <em'> 0 
<Selector xpath='//li[not(ancestor::li) and ./a/@name]' data=u'<li><a name="1" href="1">full disclosure'> 4 
<Selector xpath='//li[not(ancestor::li) and ./a/@name]' data=u'<li><a name="3" href="3">The Death Of TC'> 1 
<Selector xpath='//li[not(ancestor::li) and ./a/@name]' data=u'<li><a name="7" href="7">Re: Announcing '> 24 
[...] 

, 당신은 깨달을 필요가에 XPath 쿼리를 실행 한 결과 선택자는 SelectorList이고 각 목록 요소는 Selector 인터페이스를 구현합니다. 따라서 예를 들어 XPath를 다시 사용할 수 있습니다. 모든 어린이를 나열하십시오 :

In [3]: thread.xpath('child::*') 
Out[3]: 
[<Selector xpath='child::*' data=u'<a name="309" href="309">it\'s all about '>, 
<Selector xpath='child::*' data=u'<em>Florin Andrei (Jul 31)</em>'>, 
<Selector xpath='child::*' data=u'<ul>\n<li><a name="313" href="313">it\'s a'>] 
+0

고맙습니다. 여기에서 일하는 것 같습니다. Spacy에서 선택자를 나열하는 방법에 대한 답을 알고 있거나 다른 조언을 원한다면 기다릴 것입니다. 그렇지 않다면 여기에서 답을 수락하겠습니다. 나는 또한 당신의 대답을 upvoted. 내 질문과 대답이 모두 왜곡 된 이유를 알고 있습니까? 그들이 평이한 downvoting 대신에 개선하기 위해 논평하지 않을 때 개선하기가 어렵습니다. –

+1

답장과 선택자의 자녀 수를 얻는 방법을 보여주기 위해 답을 업데이트했습니다.귀하의 질문에 대한 아래 투표에 관해서는 추측 할 수만 있습니다. MCV 예제와 적어도 하나의 포맷 오류가 포함되어 있다고 주장 될 수 있습니다. http://stackoverflow.com/help/how-to-ask를 보시면 도움이 될 것입니다. 그러나 나는 설명 적 주석을주지 않고 downvote하는 것이 무례한 것으로 생각한다. – Markus

+0

친절하게 감사드립니다. 나는 너의 대답을 받아 들였다. –