これが繰り返しの質問である場合は、申し訳ありませんが、SOまたは他の場所で、必要なものを処理していると思われる別の質問が見つかりません。これが私の質問です:
このscrapy
Webページから情報を取得するために使用しています。明確にするために、以下はその Web ページのソース コードのブロックです。これは私にとって興味深いものです。
<p class="titlestyle">ANT101H5 Introduction to Biological Anthropology and Archaeology
<span class='distribution'>(SCI)</span></p>
<span class='normaltext'>
Anthropology is the global and holistic study of human biology and behaviour, and includes four subfields: biological anthropology, archaeology, sociocultural anthropology and linguistics. The material covered is directed to answering the question: What makes us human? This course is a survey of biological anthropology and archaeology. [<span class='Helpcourse'
onMouseover="showtip(this,event,'24 Lectures')"
onMouseout="hidetip()">24L</span>, <span class='Helpcourse'
onMouseover="showtip(this,event,'12 Tutorials')"
onMouseout="hidetip()">12T</span>]<br>
<span class='title2'>Exclusion: </span><a href='javascript:OpenCourse("WEBCOURSENOTFOUND.html")'>ANT100Y5</a><br>
<span class='title2'>Prerequisite: </span><a href='javascript:OpenCourse("WEBCOURSEANT102H5.pl?fv=1")'>ANT102H5</a><br>
</span><br/><br/<br/>
そのページのほとんどすべてのコードは、上記のブロックのように見えます。
このすべてから、次のものを取得する必要があります。
- ANT101H5 生物人類学と考古学入門
- 除外: ANT100Y5
- 前提条件: ANT102H5
問題は、それExclusion:
が a の中<span class="title2">
にANT100Y5
あり、次の の中にあること<a>
です。
このソース コードから両方を取得することはできないようです。現在、次のようなコードを取得しようとする (そして失敗する) コードがありますANT100Y5
。
hxs = HtmlXPathSelector(response)
sites = hxs.select("//*[(name() = 'p' and @class = 'titlestyle') or (name() = 'a' and @href and preceding-sibling::'//span/@class=title2')]")
「これに完全に答えるこの他のSOの質問が表示されないために盲目である」場合でも、これに関する助けをいただければ幸いです(その場合、私はこれを閉じるために投票します)。私は本当に頭がおかしいです。
前もって感謝します
編集: @Dimitre によって提案された変更後に元のコードを完成させる
私は次のコードを使用しています:
class regcalSpider(BaseSpider):
name = "disc"
allowed_domains = ['www.utm.utoronto.ca']
start_urls = ['http://www.utm.utoronto.ca/regcal/WEBLISTCOURSES1.html']
def parse(self, response):
items = []
hxs = HtmlXPathSelector(response)
sites = hxs.select("/*/p/text()[1] | \
(//span[@class='title2'])[1]/text() | \
(//span[@class='title2'])[1]/following-sibling::a[1]/text() | \
(//span[@class='title2'])[2]/text() | \
(//span[@class='title2'])[2]/following-sibling::a[1]/text()")
for site in sites:
item = RegcalItem()
item['title'] = site.select("a/text()").extract()
item['link'] = site.select("a/@href").extract()
item['desc'] = site.select("text()").extract()
items.append(item)
return items
filename = response.url.split("/")[-2]
open(filename, 'wb').write(response.body)
これにより、次の結果が得られます。
[{"title": [], "link": [], "desc": []},
{"title": [], "link": [], "desc": []},
{"title": [], "link": [], "desc": []}]
これは私が必要とする出力ではありません。私は何を間違っていますか?前述のように、このスクリプトをthisで実行していることに注意してください。