乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Python 爬蟲(chóng)正則表達(dá)式和re庫(kù),及re庫(kù)的基本使用,提取單頁(yè)面信息

       禁忌石 2022-11-06 發(fā)布于浙江

      一、正則表達(dá)式

      正則表達(dá)式是處理字符串的強(qiáng)大工具,它有自己特定的語(yǔ)法結(jié)構(gòu),有了它,實(shí)現(xiàn)字符串的檢索、替換、匹配驗(yàn)證都不在話下,正則表達(dá)式在所有編程里通用,所以不僅僅是python使用。

      以下是常用的正則表達(dá)式,用的時(shí)候參考即可,不需要死記硬背,用得多了自然就熟悉了。

      • d :匹配任意數(shù)字,等價(jià)于 [0-9]
      • D :匹配任意非數(shù)字的字符,d的取反
      • w:代表字母,數(shù)字,下劃線。也就是 a-z、A-Z、0-9、_。
      • W:代表不是字母,不是數(shù)字,不是下劃線的。w的取反
      • n:代表一個(gè)換行
      • r :代表一個(gè)回車(chē)
      • f :代表?yè)Q頁(yè)
      • t :代表一個(gè) Tab
      • s:代表所有的空白字符,也就是上面這個(gè):n、r、t、f
      • S:代表所有不是空白的字符,s的取反
      • A :代表字符串的開(kāi)始
      • Z:代表字符串的結(jié)束
      • ^ :匹配字符串開(kāi)始的位置
      • $ :匹配字符串結(jié)束的位置
      • . :代表所有的單個(gè)字符,除了 n r
      • [...] :代表在 [] 范圍內(nèi)的字符,比如 [a-z] 就代表 a到z的字母
      • [^...] :代表不在 [] 范圍內(nèi)的字符 ,[...] 的取反
      • {n} :匹配在 {n} 前面的東西,比如: o{2} 不能匹配 Bob 中的 o ,但是能匹配 food 中的兩個(gè)o
      • {n,m} :匹配在 {n,m} 前面的東西,比如:o{1,3} 將匹配“fooooood”中的前三個(gè)o
      • {n,} :匹配在 {n,} 前面的東西,比如:o{2,} 不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o
      • * :和 {0,} 一個(gè)樣,匹配 * 前面的 0 次或多次。 比如 zo* 能匹配“z”、“zo”以及“zoo”
      • + :和{1,} 一個(gè)樣,匹配 + 前面 1 次或多次。 比如 zo+”能匹配“zo”以及“zoo”,但不能匹配“z”
      • ? :和{0,1} 一個(gè)樣,匹配 ?前面 0 次或 1 次
      • a|b :匹配 a 或者 b
      • ():匹配括號(hào)里面的內(nèi)容

      1、python爬蟲(chóng)最常用組合

      死記硬背,估計(jì)很難記住,很多人就不想學(xué)了。但是只要記住最常用的組合即可。

      .*? 是我們?cè)谄ヅ溥^(guò)程中最常使用到的,表示的就是匹配任意字符。

      \d+ 匹配任意數(shù)字組合。

      上面的 .*? 為什么不直接用 .* 而需要加個(gè) ?,這個(gè)涉及到貪婪還是非貪婪匹配。

      2、貪婪還是非貪婪匹配

      貪婪匹配:就是我們的第一段代碼,一個(gè)數(shù)一個(gè)數(shù)都要去匹配,會(huì)盡可能多地去匹配內(nèi)容。

      非貪婪匹配:會(huì)盡量少的匹配符合條件的內(nèi)容 也就是說(shuō),一旦發(fā)現(xiàn)匹配符合要求,立馬就匹配成功,而不會(huì)繼續(xù)匹配下去。

      例子:

      aacbacbca.*b 貪婪匹配的內(nèi)容是:aacbacbaacbacbc 用 a.*?b 非貪婪匹配的內(nèi)容是:aacb

      二、Python的Re庫(kù)

      Python語(yǔ)言中的re模塊擁有全部的正則表達(dá)式功能。

      1、re.match函數(shù)

      函數(shù)語(yǔ)法:

      re.match(pattern, string, flags=0)pattern: 模式字符串 string:要匹配的字符串 flags:可選參數(shù),比如re.I 不區(qū)分大小寫(xiě)

      匹配成功re.match方法返回一個(gè)匹配的對(duì)象,否則返回None。

      示例:

      import reprint(re.match('ywbj', 'ywbj.cc')) # 在起始位置匹配print(re.match('ywbj', 'ywbj.cc').span()) # 在起始位置匹配print(re.match('ywbj', 'www.ywbj.cc')) # 不在起始位置匹配

      執(zhí)行結(jié)果:

      <re.Match object; span=(0, 4), match='ywbj'>                                                                                                                                                             (0, 4)                                                                          3 None

      從例子中我們可以看出,re.match()方法返回一個(gè)匹配的對(duì)象,而不是匹配的內(nèi)容。

      通過(guò)調(diào)用span()可以獲得匹配結(jié)果的位置。

      而如果從起始位置開(kāi)始沒(méi)有匹配成功,即便其他部分包含需要匹配的內(nèi)容,re.match()也會(huì)返回None。

      2、分組捕獲

      以上可以看到返回的是匹配的對(duì)象,不是匹配的內(nèi)容。

      需要獲取匹配的內(nèi)容,我們可以使用group(num) 或 groups() 匹配對(duì)象函數(shù)來(lái)獲取匹配表達(dá)式。

      一般一個(gè)小括號(hào)括起來(lái)就是一個(gè)捕獲組。我們可以使用group()來(lái)提取每組匹配到的字符串。

      • group(num=0): 匹配的整個(gè)表達(dá)式的字符串,group() 可以一次輸入多個(gè)組號(hào),在這種情況下它將返回一個(gè)包含那些組所對(duì)應(yīng)值的元組。
      • groups(): 返回一個(gè)包含所有小組字符串的元組,從 1 到 所含的小組號(hào)。

      示例:

      import recontent = 'I have 100 dogs and cats'res = re.match('^I.*?(\d+)(.*?)and(.*?)$',content)print(res.group())print(res.groups())print(res.group(1))print(res.group(2))print(res.group(3))

      執(zhí)行結(jié)果:

      I have 100 dogs and cats                                                                                                                                                                                 ('100', ' dogs ', ' cats')                                                      100                                                                              dogs                                                                            cats 

      以上成功通過(guò)group捕獲需要的詞組和內(nèi)容。

      3、re.search()函數(shù)

      re.match只匹配字符串的開(kāi)始,如果字符串開(kāi)始不符合正則表達(dá)式,則匹配失敗,函數(shù)返回None;而re.search匹配整個(gè)字符串,直到找到一個(gè)匹配。

      示例:

      import recontent = 'I have 100 dogs and 200 cats'res = re.search('\d+',content)print(res.group())

      執(zhí)行結(jié)果:

      100

      以上,如果用re.match則無(wú)法匹配,因?yàn)檎齽t表達(dá)式不符合字符串規(guī)范,會(huì)報(bào)錯(cuò)。

      而用re.search,直接匹配整個(gè)字符串。找到第一個(gè)符合 \d+ 的字符串100。

      注:僅僅是匹配第一個(gè)符合的,所以只有100,后面的200不會(huì)匹配。

      4、re.findall()函數(shù)

      re.search可以直接匹配找到符合正則的字符串,但是僅僅是**第一個(gè)**符合的。

      如果需要匹配全部的符合的,則用到re.findall()函數(shù)。

      re.findall()在字符串中找到正則表達(dá)式所匹配的所有子串,并返回一個(gè)列表,如果有多個(gè)匹配模式,則返回元組列表,如果沒(méi)有找到匹配的,則返回空列表。

      示例:

      import recontent = 'I have 100 dogs and 200 cats'res = re.findall('\d+',content)print(res)

      執(zhí)行結(jié)果:

      ['100', '200']

      由于返回的是返回一個(gè)列表或元組,所以也不需要group來(lái)捕獲。如果需要一個(gè)一個(gè)捕獲,用res[0] 或res[1]來(lái)一個(gè)一個(gè)顯示捕獲的值。

      5:re.sub()函數(shù)

      檢索和替換,Python 的 re 模塊提供了re.sub用于替換字符串中的匹配項(xiàng)。

      語(yǔ)法:

      re.sub(pattern, repl, string, count=0, flags=0)參數(shù):pattern : 正則中的模式字符串。repl : 替換的字符串,也可為一個(gè)函數(shù)。string : 要被查找替換的原始字符串。count : 模式匹配后替換的最大次數(shù),默認(rèn) 0 表示替換所有的匹配。

      示例:

      import recontent = 'I have 100 dogs and 200 cats'res = re.sub('\d+','300',content)print(res)

      執(zhí)行結(jié)果:

      I have 300 dogs and 300 cats

      6:re.compile()函數(shù)

      這個(gè)主要就是把我們的匹配符封裝一下,這個(gè)也是很常用的一個(gè)函數(shù)。

      表達(dá)式:

      re.compile(pattern[, flags])

      參數(shù):

      pattern : 一個(gè)字符串形式的正則表達(dá)式

      flags : 可選,表示匹配模式,比如忽略大小寫(xiě),多行模式等,具體參數(shù)為:

      • re.I 忽略大小寫(xiě)
      • re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依賴(lài)于當(dāng)前環(huán)境
      • re.M 多行模式
      • re.S 即為 . 并且包括換行符在內(nèi)的任意字符(. 不包括換行符)
      • re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依賴(lài)于 Unicode 字符屬性數(shù)據(jù)庫(kù)
      • re.X 為了增加可讀性,忽略空格和 # 后面的注釋

      示例:

      import recontent = 'I have 100 dogs and cats'res = re.match('^I.*?(\d+)(.*?)and(.*?)$',content,re.S)print(res.group())print(res.groups())

      以上,我們可以先用re.compile把正則表達(dá)式封裝,便于以后反復(fù)使用。封裝后如下:

      import recontent = 'I have 100 dogs and cats'pattern = re.compile('^I.*?(\d+)(.*?)and(.*?)$',re.S)res = re.match(pattern,content)print(res.group())print(res.groups())

      執(zhí)行結(jié)果相同:

      I have 100 dogs and cats('100', ' dogs ', ' cats')

      7、其他函數(shù)

      re.finditer,和 findall 類(lèi)似,在字符串中找到正則表達(dá)式所匹配的所有子串,并把它們作為一個(gè)迭代器返回。

      import re it = re.finditer(r'\d+','12a32bc43jf3') for match in it:     print (match.group() )

      輸出結(jié)果:

      1232433

      re.split,split 方法按照能夠匹配的子串將字符串分割后返回列表。

      示例:

      import repattern = re.compile(r'[A-Z]+')m = pattern.split('abcDefgHijkLmnoPqrs')print(m)

      執(zhí)行結(jié)果

      ['abc', 'efg', 'ijk', 'mno', 'qrs']

      其他函數(shù),具體用法可參考官方文檔:
      https://docs./zh-cn/3/library/re.html

      三、網(wǎng)頁(yè)中的正則提取

      1、正則表達(dá)式分析

      慣例,同樣以豆瓣電影排行做分析,鏈接為:
      https://movie.douban.com/top250

      查看源代碼,簡(jiǎn)單點(diǎn),我們提取4個(gè)信息即可。分別是排名序號(hào)、電影名稱(chēng)、導(dǎo)演演員、年份類(lèi)型。

      文章圖片1

      分析,所有信息在li標(biāo)簽中,所以首尾用在 li 標(biāo)簽中找就行了。需要的提取的信息,用()分組捕獲就行。

      1:第一個(gè)信息,排名序號(hào),排名序號(hào)1在class></em之間。em是唯一的,比較簡(jiǎn)單。

      <li.*?(\d+)</em.*?li>

      2:第二個(gè)信息,電影名稱(chēng),有很多地方,但是我們選個(gè)唯一明顯不重復(fù)的,alt= 后面是標(biāo)簽里唯一的,整個(gè)標(biāo)簽里面就一個(gè)信息,所以這里比較簡(jiǎn)單,這時(shí)正則表達(dá)式為。

      <li.*?(\d+)</em.*?alt='(.*?)'.*?li>

      3:第三個(gè)信息,導(dǎo)演演員,在<p 標(biāo)簽里面,br>標(biāo)簽上方,這時(shí)正則表達(dá)式為。

      <li.*?(\d+)</em.*?alt='(.*?)'.*?<p.*?'>(.*?)<br>.*?li>

      4:第四個(gè)信息,年份類(lèi)型,同理br>標(biāo)簽后方,</p結(jié)束,這個(gè)也很明顯,最后的正則表達(dá)式為。

      <li.*?(\d+)</em.*?alt='(.*?)'.*?<p.*?'>(.*?)<br>(.*?)</p.*?li>

      2、頁(yè)面信息提取

      正則表達(dá)式完成后,基本完成一大半了。現(xiàn)在簡(jiǎn)單提取相關(guān)信息。

      這里用到兩個(gè)庫(kù),re庫(kù)正則表達(dá)式,和requests庫(kù)抓取頁(yè)面

      import requestsimport reheaders = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/65.0.3325.162 Safari/537.36'}url='https://movie.douban.com/top250'req=requests.get(url,headers=headers)html=req.text#print(req.text)pattern= re.compile('<li.*?(\d+)</em.*?alt='(.*?)'.*?<p.*?'>(.*?)<br>(.*?)</p.*?li>',re.S)items=re.findall(pattern,html)print(items)

      執(zhí)行結(jié)果,返回一個(gè)列表,還有\(zhòng)n空格等,比較亂,類(lèi)似如下:

      [('1', '肖申克的救贖', '\n 導(dǎo)演: 弗蘭克·德拉邦特 Frank Darabont 主演: 蒂姆·羅賓斯 Tim Robbins ', '\n 1994 / 美國(guó) / 犯罪 劇情\n '), ('2', '霸王別姬', '\n 導(dǎo)演: 陳凱歌 Kaige Chen 主演: 張國(guó)榮 Leslie Cheung ', '\n 1993 / 中國(guó)大陸 中國(guó)香港 / 劇情 愛(ài)情 同性\n '), ('3', '阿甘正傳', '\n 導(dǎo)演: 羅伯特·澤米吉斯 Robert Zemeckis 主演: 湯姆·漢克斯 Tom Hanks ', '\n 1994 / 美國(guó) / 劇情 愛(ài)情\n '), ('4', '泰坦尼克號(hào)', '\n ...

      3、列表去\n空格

      為了整潔,我們先抓取列表第一個(gè)數(shù)據(jù) 即 items[0] ,并去掉\n和空格。

      列表去除\n,需要用到 strip() 函數(shù), strip() 方法用于移除字符串頭尾指定的字符(默認(rèn)為空格或換行符)或字符序列。但是該函數(shù)只支持字符串,不支持列表。所以需要用循環(huán)的方式。如下:

      new=[x.strip() for x in items[0] if x.strip()!='']

      最后更改后的代碼為:

      import requestsimport reheaders = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/65.0.3325.162 Safari/537.36'}url='https://movie.douban.com/top250'req=requests.get(url,headers=headers)html=req.text#print(req.text)pattern= re.compile('<li.*?(\d+)</em.*?alt='(.*?)'.*?<p.*?'>(.*?)<br>(.*?)</p.*?li>',re.S)items=re.findall(pattern,html)#print(items[0])new=[x.strip() for x in items[0] if x.strip()!='']print(new)

      執(zhí)行結(jié)果這時(shí)候整潔多了:

      ['1', '肖申克的救贖', '導(dǎo)演: 弗蘭克·德拉邦特 Frank Darabont   主演: 蒂姆·羅賓斯 Tim Robbins', '1994 / 美國(guó) / 犯罪 劇情']

      4、循環(huán)提前整個(gè)頁(yè)面信息

      以上只有第一個(gè)信息,整個(gè)頁(yè)面有很多信息,需要全部提取,并排列整齊,所以需要再次用到for循環(huán),一列一列的顯示出來(lái)。

      最終代碼為:

      import requestsimport reheaders = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/65.0.3325.162 Safari/537.36'}url='https://movie.douban.com/top250'req=requests.get(url,headers=headers)html=req.text#print(req.text)#pattern= re.compile('<li.*?(\d+)</em.*?alt='(.*?)'.*?</li>',re.S)pattern= re.compile('<li.*?(\d+)</em.*?alt='(.*?)'.*?<p.*?'>(.*?)<br>(.*?)</p.*?li>',re.S)items=re.findall(pattern,html)#print(items[0])for item in items: new=[x.strip() for x in item if x.strip()!=''] print(new)

      執(zhí)行結(jié)果:

      ['1', '肖申克的救贖', '導(dǎo)演: 弗蘭克·德拉邦特 Frank Darabont   主演: 蒂姆·羅賓斯 Tim Robbins /...', '1994 / 美國(guó) / 犯罪 劇情']['2', '霸王別姬', '導(dǎo)演: 陳凱歌 Kaige Chen   主演: 張國(guó)榮 Leslie Cheung / 張豐毅 Fengyi Zha...', '1993 / 中國(guó)大陸 中國(guó)香港 / 劇情 愛(ài)情 同性']['3', '阿甘正傳', '導(dǎo)演: 羅伯特·澤米吉斯 Robert Zemeckis   主演: 湯姆·漢克斯 Tom Hanks / ...', '1994 / 美國(guó) / 劇情 愛(ài)情']['4', '泰坦尼克號(hào)', '導(dǎo)演: 詹姆斯·卡梅隆 James Cameron   主演: 萊昂納多·迪卡普里奧 Leonardo...', '1997 / 美國(guó) 墨西哥 澳大利亞 加拿大 / 劇情 愛(ài)情 災(zāi)難']['5', '這個(gè)殺手不太冷', '導(dǎo)演: 呂克·貝松 Luc Besson   主演: 讓·雷諾 Jean Reno / 娜塔莉·波特曼 ...', '1994 / 法國(guó) 美國(guó) / 劇情 動(dòng)作 犯罪']['6', '美麗人生', '導(dǎo)演: 羅伯托·貝尼尼 Roberto Benigni   主演: 羅伯托·貝尼尼 Roberto Beni...', '1997 / 意大利 / 劇情 喜劇 愛(ài)情 戰(zhàn)爭(zhēng)']['7', '千與千尋', '導(dǎo)演: 宮崎駿 Hayao Miyazaki   主演: 柊瑠美 Rumi H?ragi / 入野自由 Miy...', '2001 / 日本 / 劇情 動(dòng)畫(huà) 奇幻']['8', '辛德勒的名單', '導(dǎo)演: 史蒂文·斯皮爾伯格 Steven Spielberg   主演: 連姆·尼森 Liam Neeson...', '1993 / 美國(guó) / 劇情 歷史 戰(zhàn)爭(zhēng)']['9', '盜夢(mèng)空間', '導(dǎo)演: 克里斯托弗·諾蘭 Christopher Nolan   主演: 萊昂納多·迪卡普里奧 Le...', '2010 / 美國(guó) 英國(guó) / 劇情 科幻 懸疑 冒險(xiǎn)']['10', '星際穿越', '導(dǎo)演: 克里斯托弗·諾蘭 Christopher Nolan   主演: 馬修·麥康納 Matthew Mc...', '2014 / 美國(guó) 英國(guó) 加拿大 / 劇情 科幻 冒險(xiǎn)']['11', '忠犬八公的故事', '導(dǎo)演: 萊塞·霍爾斯道姆 Lasse Hallstr?m   主演: 理查·基爾 Richard Ger...', '2009 / 美國(guó) 英國(guó) / 劇情']['12', '楚門(mén)的世界', '導(dǎo)演: 彼得·威爾 Peter Weir   主演: 金·凱瑞 Jim Carrey / 勞拉·琳妮 Lau...', '1998 / 美國(guó) / 劇情 科幻']['13', '海上鋼琴師', '導(dǎo)演: 朱塞佩·托納多雷 Giuseppe Tornatore   主演: 蒂姆·羅斯 Tim Roth / ...', '1998 / 意大利 / 劇情 音樂(lè)']['14', '三傻大鬧寶萊塢', '導(dǎo)演: 拉庫(kù)馬·希拉尼 Rajkumar Hirani   主演: 阿米爾·汗 Aamir Khan / 卡...', '2009 / 印度 / 劇情 喜劇 愛(ài)情 歌舞']['15', '機(jī)器人總動(dòng)員', '導(dǎo)演: 安德魯·斯坦頓 Andrew Stanton   主演: 本·貝爾特 Ben Burtt / 艾麗...', '2008 / 美國(guó) / 科幻 動(dòng)畫(huà) 冒險(xiǎn)']['16', '放牛班的春天', '導(dǎo)演: 克里斯托夫·巴拉蒂 Christophe Barratier   主演: 讓-巴蒂斯特·莫尼...', '2004 / 法國(guó) 瑞士 德國(guó) / 劇情 喜劇 音樂(lè)']['17', '無(wú)間道', '導(dǎo)演: 劉偉強(qiáng) / 麥兆輝   主演: 劉德華 / 梁朝偉 / 黃秋生', '2002 / 中國(guó)香港 / 劇情 犯罪 驚悚']['18', '瘋狂動(dòng)物城', '導(dǎo)演: 拜倫·霍華德 Byron Howard / 瑞奇·摩爾 Rich Moore   主演: 金妮弗·...', '2016 / 美國(guó) / 喜劇 動(dòng)畫(huà) 冒險(xiǎn)']['19', '大話西游之大圣娶親', '導(dǎo)演: 劉鎮(zhèn)偉 Jeffrey Lau   主演: 周星馳 Stephen Chow / 吳孟達(dá) Man Tat Ng...', '1995 / 中國(guó)香港 中國(guó)大陸 / 喜劇 愛(ài)情 奇幻 古裝']['20', '熔爐', '導(dǎo)演: 黃東赫 Dong-hyuk Hwang   主演: 孔侑 Yoo Gong / 鄭有美 Yu-mi Jung /...', '2011 / 韓國(guó) / 劇情']['21', '控方證人', '導(dǎo)演: 比利·懷爾德 Billy Wilder   主演: 泰隆·鮑華 Tyrone Power / 瑪琳·...', '1957 / 美國(guó) / 劇情 犯罪 懸疑']['22', '教父', '導(dǎo)演: 弗朗西斯·福特·科波拉 Francis Ford Coppola   主演: 馬龍·白蘭度 M...', '1972 / 美國(guó) / 劇情 犯罪']['23', '當(dāng)幸福來(lái)敲門(mén)', '導(dǎo)演: 加布里爾·穆奇諾 Gabriele Muccino   主演: 威爾·史密斯 Will Smith ...', '2006 / 美國(guó) / 劇情 傳記 家庭']['24', '觸不可及', '導(dǎo)演: 奧利維·那卡什 Olivier Nakache / 艾力克·托蘭達(dá) Eric Toledano   主...', '2011 / 法國(guó) / 劇情 喜劇']['25', '怦然心動(dòng)', '導(dǎo)演: 羅伯·萊納 Rob Reiner   主演: 瑪?shù)铝铡た_爾 Madeline Carroll / 卡...', '2010 / 美國(guó) / 劇情 喜劇 愛(ài)情']

      到這里,單個(gè)頁(yè)面的信息就已經(jīng)提取完成了,也算是完成了爬蟲(chóng)的一小步了。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶(hù) 評(píng)論公約

        類(lèi)似文章 更多