我正在使用XPath
withScrapy
从电影网站 BoxOfficeMojo.com 上抓取数据。
作为一个一般性问题:我想知道如何在一个Xpath
字符串中选择一个父节点的某些子节点。
根据我从中抓取数据的电影网页,有时我需要的数据位于不同的子节点,例如是否有链接。我将浏览大约 14000 部电影,所以这个过程需要自动化。
以此为例。我需要演员、导演和制片人。
这是Xpath
给导演的:注意: %s 对应于找到该信息的确定索引 - 在动作杰克逊示例director
中找到 at[1]
和actors
at [2]
。
//div[@class="mp_box_content"]/table/tr[%s]/td[2]/font/text()
但是,是否存在指向导演页面的链接,这将是Xpath
:
//div[@class="mp_box_content"]/table/tr[%s]/td[2]/font/a/text()
演员有点棘手,因为<br>
列出了后续演员,可能是 an 的孩子/a
或 parent的孩子/font
,所以:
//div[@class="mp_box_content"]/table/tr[%s]/td[2]/font//a/text()
获取几乎所有的演员(除了那些有font/br
)。
现在,我相信这里的主要问题是有多个//div[@class="mp_box_content"]
- 我拥有的所有东西都可以工作,除了我最终也从其他mp_box_content
. 我还添加了许多try:
,except:
声明以获取所有内容(演员、导演、制片人,他们都有或没有与他们相关的链接)。例如,以下是我Scrapy
的演员代码:
actors = hxs.select('//div[@class="mp_box_content"]/table/tr[%s]/td[2]/font//a/text()' % (locActor,)).extract()
try:
second = hxs.select('//div[@class="mp_box_content"]/table/tr[%s]/td[2]/font/text()' % (locActor,)).extract()
for n in second:
actors.append(n)
except:
actors = hxs.select('//div[@class="mp_box_content"]/table/tr[%s]/td[2]/font/text()' % (locActor,)).extract()
这是试图掩盖以下事实:第一个演员可能没有与他/她相关联的链接,而随后的演员有,第一个演员可能有一个与他/她相关联的链接,但其余的可能没有。
感谢您花时间阅读本文以及任何帮助我查找/解决此问题的尝试!如果需要更多信息,请告诉我。