1

我正在尝试编写一个脚本来抓取一个网站,并且正在使用这个(http://www.theericwang.com/scripts/eBayRead.py)。

但是,我想用它来抓取 ebay 以外的网站,并根据我的需要进行定制。

我对python相当陌生,并且经验有限。

我不确定这条线能实现什么。

for url, title in re.findall(r'href="([^"]+).*class="vip" title=\'([^\']+)', lines):

有人可以给我一些指示吗?

如果我将它移植到其他网站,还有什么需要考虑的吗?

4

3 回答 3

3

我不确定这是否会回答你的问题。但是你可以考虑使用scrapy : http://scrapy.org来抓取各种网站。这是一个很好的基础设施,提供了很大的灵活性,并且很容易根据某些特定需求进行定制。

于 2012-11-15T04:45:31.553 回答
3

一般来说,解析 HTML 最好使用 BeautifulSoup 之类的库,它几乎可以为您处理所有繁重的工作,为您留下更直观的代码。另外,请阅读下面的@Tadeck 链接 - 如果可以避免正则表达式和 HTML,则不应混合使用(轻描淡写)。

至于您的问题,该行使用称为“正则表达式”的东西来查找文本中的匹配模式(在本例中为 HTML)。re.findall()是一个返回列表的方法,所以如果我们只关注它:

re.findall(r'href="([^"]+).*class="vip" title=\'([^\']+)', lines):

r表示以下内容将被解释为“原始”,这意味着反斜杠等字符将按字面意思解释。

href="([^"]+)

括号表示一个组(我们在匹配中关心的内容),[^"]+意思是“匹配任何不是引用的东西”。正如您可能猜到的那样,该组将返回链接的 URL。

.*class="vip"

匹配任何东西(嗯,.*几乎任何东西)0 次或更多次(这里可能包括其他标签、链接的结束引号、空格等)。没什么特别的class="vip"——它只需要出现。

title=\'([^\']+)', lines):

在这里,您会看到一个转义的引用,然后是我们在上面看到的另一个组。这一次,我们将捕获title标记后两个撇号之间的任何内容。

这样做的最终结果是您正在遍历所有匹配项的列表,这些匹配项看起来像(my_matched_link, my_matched_title),被传递到for url, title,之后进行进一步处理。

于 2012-11-15T05:08:09.863 回答
2

正则表达式不利于解析 HTML

以上是我想与您交流的主要思想。为什么,请看这个问题:RegEx match open tags except XHTML self-contained tags

简而言之,HTML 可以作为文本进行更改(例如,可以添加新属性,可以更改属性顺序,或者可能会引入一些其他更改),但它会产生与 Web 浏览器解释完全相同的 HTML,而完全破坏你的剧本。

HTML 应该使用专门的 HTML 解析器或网络爬虫来解析。当差异变得重要时,他们知道差异。

刮痧用什么?

有多种解决方案,但最值得注意的解决方案之一是:ScraPy。试试看,你可能会开始爱上它。

于 2012-11-15T05:14:28.260 回答